Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 108,456

HOME > .NET Framework > Forum > สอบถามเรื่องการตัดคำครับ โดยจำนวนคำเท่ากัน แต่มีหลายเงื่อนไข



 

สอบถามเรื่องการตัดคำครับ โดยจำนวนคำเท่ากัน แต่มีหลายเงื่อนไข

 



Topic : 129411



โพสกระทู้ ( 156 )
บทความ ( 0 )



สถานะออฟไลน์




สอบถามเรื่องการตัดคำครับ ผมจะตัดคำที่รับ ค่ามาเป็น string แล้ว ผมตัดคำจะเอาเฉพาะตัวเลขครับ แต่ว่าผมใช้การตัดโดยใช้คำสั่ง mid แต่ติดตรงที่ว่าตำแหน่งมันจะเลื่อนไปครับ ตามหลักของตัวเลข (โปรแกรมอ่านค่าจาก textfile)

format ผม จะประมาณนี้ครับ
สแกนยังไม่ครบ Box G1709/02911 6/504 10/31/2017 2:27:27 PM
สแกนยังไม่ครบ Box G1709/02918 60/504 10/31/2017 2:27:56 PM
สแกนยังไม่ครบ Box G1709/02921 108/504 10/31/2017 2:27:56 PM

ผมใช้การตัดคำโดยแบ่งเป็นแบบนี้ครับ ตามสี วันที่เวลาผมตัดทิ้งไปครับ ไม่ต้องการ แต่ว่า เลข ข้างหน้าที่เป้นสีส้ม เป็นหลัก หน่วย สิบ ร้อย ผมไม่สามารถกำหนดที่ให้มันตัดคำได้ตรงตามต้องการครับ ส่วนเลขข้างหลังสีนํ้าเงินผมสามารถกำหนดได้แล้วครับ สีส้มจะแสดงผลแบบนี้ครับ


หลักหน่วย 2/504
หลักสิบ 32/50
หลักร้อย 132/5 อันนี้ตามเงื่อนไขตัด /5 ตรงแล้วครับ

Code (VB.NET)
Dim contoint1 As String
        Dim contoint2 As String
        Dim Strtext As String
        Dim TextArray As String
        Dim Deltext As String
        Dim i As Integer
        Dim c As Integer = sArray.Length - 1
        For i = 0 To c
            TextArray = sArray(i)
            Strtext = TextArray
            Strtext = Mid(TextArray, 19, 11)

            If TextBox1.Text = Strtext.ToString Then

                If TextBox1.Text = Strtext.ToString Then
                    contoint1 = TextArray
                    contoint1 = Mid(contoint1, 33, 5)
                    If contoint1.Trim().Length = 5 Then
                        contoint1 = Mid(contoint1, 3, 4)
                    ElseIf contoint1.Trim().Length = 4 Then
                        contoint1 = Mid(contoint1, 2, 3)
                    ElseIf contoint1.Trim().Length = 3 Then
                        contoint1 = Mid(contoint1, 1, 3)
                    End If
                    Label17.Visible = True
                    Label17.Text = Convert.ToInt32(contoint1)
                End If

                If TextBox1.Text = Strtext.ToString Then
                    contoint2 = TextArray
                    contoint2 = Mid(contoint2, 31, 5) '31 5
                    If contoint2.Trim().Length = 5 Then
                        contoint2 = Mid(contoint2, 1, 3)
                        'contoint2 = Mid(contoint2, 1, 2)
                        'contoint2 = Mid(contoint2, 1, 1)
                    End If
                    Label24.Visible = True
                    Label24.Text = Convert.ToInt32(contoint2) / 12 & "/" & Convert.ToInt32(contoint1) / 12
                End If

            Dim Texti As String
            If TextBox1.Text = Strtext.ToString Then
                    Texti = TextArray
                    Texti = Mid(Texti, 1, 29)
                    Label20.Visible = True
                    Label20.Text = Texti & " " & Convert.ToInt32(contoint2) & "/" & Convert.ToInt32(contoint1)
                End If
            End If
        Next




Tag : .NET









ประวัติการแก้ไข
2017-11-03 14:12:02
2017-11-03 14:13:11
2017-11-03 14:20:36
2017-11-03 14:22:38
2017-11-03 14:26:28
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2017-11-03 14:11:37 By : bankguszo View : 1127 Reply : 8
 

 

No. 1



โพสกระทู้ ( 280 )
บทความ ( 0 )



สถานะออฟไลน์


regex เลย ครับ

1311

Code (VB.NET)
Dim strRegex as String = "(Box\s{0,}G\d{1,}/\d{1,}\s{0,}\d{1,}/\d{1,})"
Dim myRegex As New Regex(strRegex, RegexOptions.None)
Dim strTargetString As String = ข้อความ

For Each myMatch As Match In myRegex.Matches(strTargetString)
	 If myMatch.Success Then
    ' Add your code here
  End If
Next








แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-03 14:39:08 By : Dr.K
 


 

No. 2



โพสกระทู้ ( 156 )
บทความ ( 0 )



สถานะออฟไลน์


regex ผมโหลดมาใช้ดูแล้วครับ แต่ผมไม่เข้าใจรูปแบบมันครับ ว่ามันทำงานยังไง

ส่วนที่ผมถาม ถ้าเอาเป็นแบบเงื่อนไข พอจะแนะนำได้ไหมครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-03 15:21:50 By : bankguszo
 

 

No. 3



โพสกระทู้ ( 280 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 2 เขียนโดย : bankguszo เมื่อวันที่ 2017-11-03 15:21:50
รายละเอียดของการตอบ ::
จากโค้ด ตาม คำถาม regex จะสะดวกกว่า ครับ

ถึงแม้มันจะยาก แต่ถ้าได้เรียนรู้ จะเห็นว่า มันลดการผิดพลาดของโค้ด แบบ string ลงเยอะมาก

สัญลักษณ์ ความหมาย
. ทุกตัวอักษรยกเว้นการขึ้นบรรทัดใหม่
\w ทุกๆ ตัวอักษรและ underscore
\W ที่ไม่ใช่ตัวอักษร
\d ตัวเลขทุกตัว
\D ที่ไม่ใช่ตัวเลข
\s whitespace(tab, space, line break)
\S ที่ไม่ใช่ whitespace
[abc] a, b หรือ c อย่างใดอย่างหนึ่ง
[^abc] อะไรก็ได้ที่ไม่ใช่ a,b หรือ c
[a-f] อะไรก็ได้ระหว่าง a ถึง f
^ เริ่มต้น line
$ สิ้นสุด line
\A เริ่มต้นคำ
\z สิ้นสุดคำ
(…) capture group
\1 reference group #1
(a b)
a* ไม่มี a หรือมีก็ได้
a+ a อย่างน้อย 1 ตัว
a? ไม่มี a หรือมี a ได้แค่ 1ตัว
a{5} มี a 5 ตัว
a{2,5} มี a ได้ 2 ถึง 5 ตัว

https://devahoy.com/posts/regular-expressions-101/

ผมเองก็ไม่ถนัด regex แต่เห็นว่ามันเร็วและ ลดโค้ดลงได้ ในที่นี้ จะขอพูดแค่เท่าที่ผมรู้นะครับ

regex เริ่มจาก แพทเทิร์น ของ ข้อความที่ต้อง การเช่น

"(Box\s{0,}G\d{1,}/\d{1,}\s{0,}\d{1,}/\d{1,})"

จากข้อความที่ต้องการเช่น

Code
สอบถามเรื่องการตัดคำครับ ผมจะตัดคำที่รับ ค่ามาเป็น string แล้ว ผมตัดคำจะเอาเฉพาะตัวเลขครับ แต่ว่าผมใช้การตัดโดยใช้คำสั่ง mid แต่ติดตรงที่ว่าตำแหน่งมันจะเลื่อนไปครับ ตามหลักของตัวเลข (โปรแกรมอ่านค่าจาก textfile) format ผม จะประมาณนี้ครับ สแกนยังไม่ครบ Box G1709/02911 6/504 10/31/2017 2:27:27 PM สแกนยังไม่ครบ Box G1709/02918 60/504 10/31/2017 2:27:56 PM สแกนยังไม่ครบ Box G1709/02921 108/504 10/31/2017 2:27:56 PM ผมใช้การตัดคำโดยแบ่งเป็นแบบนี้ครับ ตามสี วันที่เวลาผมตัดทิ้งไปครับ ไม่ต้องการ แต่ว่า เลข ข้างหน้าที่เป้นสีส้ม เป็นหลัก หน่วย สิบ ร้อย ผมไม่สามารถกำหนดที่ให้มันตัดคำได้ตรงตามต้องการครับ ส่วนเลขข้างหลังสีนํ้าเงินผมสามารถกำหนดได้แล้วครับ สีส้มจะแสดงผลแบบนี้ครับ


regex ไม่สนใจว่าข้อความที่อยากได้อยู่บรรทัดไหน สนใจแค่มันตรงกับ แพทเทิร์นรึไม่

"(Box\s{0,}G\d{1,}/\d{1,}\s{0,}\d{1,}/\d{1,})"
\s{0,} => space ตั้งแต่ 0 ตัว ขึ้นไป ดังจะเห็นว่าใช้ {0,} แทนการบอกว่า 0 ตัวขึ้นไป
\d{1,} =>ตัวเลข(0-9) ตั้งแต่ 1 ตัว ขึ้นไป ดังจะเห็นว่าใช้ {1,} แทนการบอกว่า 1 ตัวขึ้นไป

ในกรณีที่จำนวนตายตัวก็ใช้ \d{5} แทนว่าต้องมีตัวเลข 5 ตัวเท่านั้น และใช้ \d{2,5} เพื่อแทนว่าต้องมีตัวเลข 2 - 5 ครับ
ค่าที่ได้จะออกมาเป็น array เราก็แค่ for loop ไปใช้งาน แค่นั้นครับ

( ) คือค่าที่เราอยากได้

เช่น

2

มาจาก

"Box\s{0,}G\d{1,}/\d{1,}\s{0,}(\d{1,}/\d{1,})"

แต่ถ้า
3

มาจาก

"(Box\s{0,}G\d{1,}/\d{1,}\s{0,}\d{1,}/\d{1,})"

และก็

4
มาจาก

"(Box\s{0,}G\d{1,}/\d{1,})\s{0,}(\d{1,}/\d{1,})"

จะเห็นได้ว่าลูกเล่นจะเยอะกว่า string ที่เราเคยใช้กัน และก็แยกข้อความได้แม่นยำกว่า เพราะไม่ต้องสนใจเรื่อง substring indexof trim replace อีกด้วย ครับ


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-03 15:51:26 By : Dr.K
 


 

No. 4



โพสกระทู้ ( 156 )
บทความ ( 0 )



สถานะออฟไลน์


ผมขอศึกษาเพิ่มก่อนครับ ขอบคุณมากๆครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-03 16:14:13 By : bankguszo
 


 

No. 5



โพสกระทู้ ( 819 )
บทความ ( 0 )



สถานะออฟไลน์


ข้อความจะคั่นด้วย ช่องว่างเสมอหรือปล่าวครับ
ถ้าใช่ลองเอาข้อความมา split เพื่อให้มันกลายเป็น Array ดูครับ
เมื่ออยู่ใน Array แล้ว
ลองดูว่ามันอยู่ที่ตำแหน่งเดิมตลอดหรือปล่าวครับ
ถ้ามันอยู่ที่เดิมตลอด เราก็สามารถเรียกใช้ข้อความนั้น ๆ มาใช้ได้เสมอ

วิธีตัดคำ ก็ให้ดูที่ / เป็นหลักครับ

Code (VB.NET)
   Dim str As String
        Dim a, b As Int16

        str = "2/504"
        a = Mid(str, 1, InStr(str, "/") - 1)
        b = Mid(str, InStr(str, "/") + 1)
        MsgBox(a)
        MsgBox(b)

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-03 16:36:04 By : fonfire
 


 

No. 6



โพสกระทู้ ( 280 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 4 เขียนโดย : bankguszo เมื่อวันที่ 2017-11-03 16:14:13
รายละเอียดของการตอบ ::
ลองศึกษาดูครับะสะดวกกว่าการใช้ string

เพราะ string
อย่างในข้อความนี้
Code
สอบถามเรื่องการตัดคำครับ ผมจะตัดคำที่รับ ค่ามาเป็น string แล้ว ผมตัดคำจะเอาเฉพาะตัวเลขครับ แต่ว่าผมใช้การตัดโดยใช้คำสั่ง mid แต่ติดตรงที่ว่าตำแหน่งมันจะเลื่อนไปครับ ตามหลักของตัวเลข (โปรแกรมอ่านค่าจาก textfile) format ผม จะประมาณนี้ครับ สแกนยังไม่ครบ Box G1709/02911 6/504 10/31/2017 2:27:27 PM สแกนยังไม่ครบ Box G1709/02918 60/504 10/31/2017 2:27:56 PM สแกนยังไม่ครบ Box G1709/02921 108/504 10/31/2017 2:27:56 PM ผมใช้การตัดคำโดยแบ่งเป็นแบบนี้ครับ ตามสี วันที่เวลาผมตัดทิ้งไปครับ ไม่ต้องการ แต่ว่า เลข ข้างหน้าที่เป้นสีส้ม เป็นหลัก หน่วย สิบ ร้อย ผมไม่สามารถกำหนดที่ให้มันตัดคำได้ตรงตามต้องการครับ ส่วนเลขข้างหลังสีนํ้าเงินผมสามารถกำหนดได้แล้วครับ สีส้มจะแสดงผลแบบนี้ครับ


เราต้องมาหาอีกว่าข้อความของเราอยู่บรรทัดไหน แล้ว ต้องมากังวลเรื่องการตตัด หรือ จำนวนตัวอักษร ว่าจะตรงรึไม่
ถ้าข้อมูลซัก 1000 บรรทัด ก็ตต้อง for ถึง 1000 รอบถึงจจะอ่านค่าได้หมด จริงไม๊ครับ


แต่ regex มันไม่สนใจเรื่องนั้น มันอ่าน ทั้งไฟล์ แล้วก็สนแค่ ข้อความที่มี รูปแบบ เหมือนที่ต้องการ
ถึงจจะมี 1000 หรือ 100000 บรรทัด ก็ทำได้ในครั้งเดียว และ จจะไม่มีข้อผิดพลาด เรื่องจำนวนอักษร ด้วย
อย่าง
Box G1709/02911
ถ้าเราเปลี่ยนเป็น
Box H1709/02911

string เราต้องมาเขียนโค้ดใหม่ เพื่อค้อนหา

regex ใช้ [A-Z]แค่นี้ก็ครอบคลุมครบหมดเลย ครับ

หรือ "BOX " เพื่ออยากเปลี่ยนเป็นอย่างอื่นเรารำคาญแก้ก็ใช้แค่

.*?\d{4}/\d{5}

จะได้ทั้ง
Box G1709/02911
และ
My Love H1719/02922
และ

https://www.thaicreate.com A1819/03922




แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-04 09:31:22 By : Dr.K
 


 

No. 7



โพสกระทู้ ( 8,696 )
บทความ ( 2 )



สถานะออฟไลน์


Code (VB.NET)
Function xyz(ByVal sArray() As String)
	Dim Field() As String
	For Each Row as String In sArray
		Field = Row.split(" ")
		For Each Value as String In Field
			MessageBox.Show(Value)
		Next
	Next
End Function

แต่ศึกษาเรื่อง regular expression ไว้ก็ดีนะครับ พวก string ที่ไม่มีรูปแบบ จะใช้งานได้ดี

แต่ถ้าสามารถใช้คำสั่งพื้นฐานสร้างงานเป็น นั้นก็เป็นการย้ำเตือนให้เรารู้ว่าเราไปอีกระดับหนึ่ง
มีอัลกอลิธึมเป็น่ของตัวเองแล้ว

สู้ๆ ศึกษาต่อไปครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-04 09:53:41 By : Chaidhanan
 


 

No. 8



โพสกระทู้ ( 156 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบคุณทุกคนมากๆครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-06 09:56:44 By : bankguszo
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : สอบถามเรื่องการตัดคำครับ โดยจำนวนคำเท่ากัน แต่มีหลายเงื่อนไข
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: Voake, Comcube, รับทำเว็บไซต์ รับเขียนโปรแกรม , รับทำบัญชี , โรงงานผลิตครีม , สำนักงานบัญชี , รับจดทะเบียนบริษัท , Pangpond , รถมือสอง

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2020 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่