none
文字檔無法分割 RRS feed

  • 問題

  • 請問當我讀入文字檔(中文和數字組成的文字檔)時,為甚麼無法使用split函式分割

    這是我的程式碼

    Imports System.IO
    Module Module1
        Dim data1() As String

        Sub Main()
            ReadFile()
            Console.ReadKey()
        End Sub

        Structure data
            Dim Name As String
            Dim lastday, open, high, low, endprise As Double
        End Structure

        Dim Totaldata As New List(Of data)

        Private Sub ReadFile()
            Console.WriteLine("讀入 ./tt.txt 檔")
            data1 = File.ReadAllLines("tt.txt", System.Text.Encoding.Default)
            Dim data2() As String
            For i = 0 To data1.Length - 1
                Dim a1 As data
                data2 = data1(i).Split({" "}, StringSplitOptions.RemoveEmptyEntries)
                a1.high = data2(0)
                a1.low = data2(1)
                Totaldata.Add(a1)
            Next





        End Sub
    End Module

     這是我的文字檔 :

    A B C D E F G H
    1 代號 名稱 前交易日 開盤價 最高價 最低價 收盤價 成交量
    2 '4968 立積 155 160 170.5 159 170.5 15950
    3 '3581 博磊 15. 05 15.1 16. 55 15.1 16. 55 613
    4 '2504 國產 8.46 9.3 9.3 9.3 9.3 12272
    5 '3588 通嘉 23.7 23.7 26. 05 23.7 26. 05 1621
    6 '2429 銘旺科 18.75 18.75 20.6 18.75 20.6 120
    7 '3041 揚智 11.7 11.9 12. 85 11.9 12. 85 47101
    8 '2337 旺宏 32.1 32.6 33.8 32.2 33.8 155939
    9 '2505 國揚 12.5 12.5 13.5 12.5 13 1523
    10 '6202 盛群 65.2 65.2 66.8 65.2 66.8 767
    11 '2317 鴻海 73.5 73.8 74.5 73.8 74.5 33275
    12 '2331 精英 12. 85 12.9 13. 25 12. 85 13 1665
    13 '1101 台泥 39.8 39.8 40.2 39. 65 40.2 13091
    14 '3679 新至陞 47.5 47.5 47.9 47.4 47.8 7
    15 '2423 固緯 25. 85 26 26.15 25.8 26 142
    16 '2498 宏逢電 37.5 37.6 38.15 37.3 37.7 6580
    17 '2332 友訊 12.1 12.15 12.2 12. 05 12.15 2024
    18 '1102 亞泥 43.6 43. 65 43.9 43.5 43. 65 7163
    19 '2427 三商電 10. 55 10.55 10.55 10.5 10.55 164
    20 '3008 大立光 4300 4320 4350 4290 4300 897
    21 '2330 台積電 265 266 266.5 264 264 43868
    22 '9962 有益 10.75 10.75 10.75 10.65 10.7 23
    23 '2324 仁寶 18.2 10.15 12 1&05 1.05 13706
    24 '2308 台達電 148.5 148.5 148.5 145.5 145.5 8759
    25 '6154 順發 16.1 15.1 15.1 14.5 14.5 201
    26 '3678 聯享 8.52 10.45 10.45 7. 67 7.67 107000
    27 '8087 華鎂鑫 8.29 7. 78 10.05 7. 47 7.46 12


    • 已編輯 willyaa 2019年12月14日 上午 07:19
    2019年12月13日 上午 10:28

解答

  • 說不定是 vbTab

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 willyaa 2019年12月14日 下午 12:36
    2019年12月14日 上午 08:42

  • 經 心冷熱情熄 前輩的提醒, 修改樓主的程式, 增加可能為 vbTab 等判斷:

        Private Sub ReadFile()
            Console.WriteLine("讀入 ./tt.txt 檔")
            data1 = File.ReadAllLines("tt.txt", System.Text.Encoding.Default)
            Dim data2() As String
            For i = 0 To data1.Length - 1
                Dim a1 As New data
                '1. 將 "15. 05"、"16. 55" 之類的修正為 "15.05"、"16.55"...
                '2. 空格可能其實是 Tab.
                data2 = data1(i).Replace(". ", ".").Replace("." & vbTab, ".").Split({" ", vbTab}, StringSplitOptions.RemoveEmptyEntries)
    
                ReDim Preserve data2(9)
                '3. 排除 Nothong.
                If (data2(1) IsNot Nothing) AndAlso data2(1).StartsWith("'") Then '誤會了, 真的有行號.
                    a1.Name = data2(2)
                    a1.high = Val(data2(5))
                    a1.low = Val(data2(6))
                    Totaldata.Add(a1)
                End If
            Next
        End Sub
    供參考.


    Ader

    • 已標示為解答 willyaa 2019年12月14日 下午 12:36
    2019年12月14日 上午 09:15

所有回覆

  • 原回覆後, 樓主改了問題內容, 為防誤會, 只好也跟著改回覆內容...

    從題目猜測應該是要抓最高價和最低價(?), 基於此猜測修改樓主的程式:

        Private Sub ReadFile()
            Console.WriteLine("讀入 ./tt.txt 檔")
            data1 = File.ReadAllLines("tt.txt", System.Text.Encoding.Default)
            Dim data2() As String
            For i = 0 To data1.Length - 1
                Dim a1 As New data
                data2 = data1(i).Split({" "}, StringSplitOptions.RemoveEmptyEntries)
    
                '不確定樓主文字檔裡是不是真的以行號開頭? 所以多加一些冗餘程式判斷以適合兩種情況:
                ReDim Preserve data2(9)
                If data2(0).StartsWith("'") Then    '沒有行號啦.
                    a1.Name = data2(1)
                    a1.high = Val(data2(4))
                    a1.low = Val(data2(5))
                    Totaldata.Add(a1)
    
                ElseIf data2(1).StartsWith("'") Then '誤會了, 真的有行號.
                    a1.Name = data2(2)
                    a1.high = Val(data2(5))
                    a1.low = Val(data2(6))
                    Totaldata.Add(a1)
    
                Else
                    '這行不是資料, 忽略.
                End If
            Next
    
        End Sub

    看看猜得對不對?


    • 已編輯 Ader.Chen 2019年12月13日 下午 04:19 樓主改了問題內容, 隨之更改回覆
    2019年12月13日 上午 10:41
  • 已更改程式碼,還是跟原來的問題一樣

    2019年12月13日 上午 10:50
  • 建議用OleDbDataAdapter來讀取, 效率佳又省事, 請參考:

    OLEDB Import of CSV to VB.NET datatable reading '-' as 0

    2019年12月13日 下午 12:06
  • System.InvalidCastException: '從字串 "2 '4968 立積 155 160 170.5 159 170" 至類型 'Double' 的轉換是無效的。'

    出現這段錯誤訊息,還是無法分割

    2019年12月14日 上午 07:19
  • ? 我試上面的程式是正常的說...

    關鍵是 

    data2 = data1(i).Split({" "}, StringSplitOptions.RemoveEmptyEntries)

    a1. = Val(data2(5))

    還是空格其實不是空格?


    Ader


    • 已編輯 Ader.Chen 2019年12月14日 上午 08:42
    2019年12月14日 上午 08:39
  • 說不定是 vbTab

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 willyaa 2019年12月14日 下午 12:36
    2019年12月14日 上午 08:42

  • 經 心冷熱情熄 前輩的提醒, 修改樓主的程式, 增加可能為 vbTab 等判斷:

        Private Sub ReadFile()
            Console.WriteLine("讀入 ./tt.txt 檔")
            data1 = File.ReadAllLines("tt.txt", System.Text.Encoding.Default)
            Dim data2() As String
            For i = 0 To data1.Length - 1
                Dim a1 As New data
                '1. 將 "15. 05"、"16. 55" 之類的修正為 "15.05"、"16.55"...
                '2. 空格可能其實是 Tab.
                data2 = data1(i).Replace(". ", ".").Replace("." & vbTab, ".").Split({" ", vbTab}, StringSplitOptions.RemoveEmptyEntries)
    
                ReDim Preserve data2(9)
                '3. 排除 Nothong.
                If (data2(1) IsNot Nothing) AndAlso data2(1).StartsWith("'") Then '誤會了, 真的有行號.
                    a1.Name = data2(2)
                    a1.high = Val(data2(5))
                    a1.low = Val(data2(6))
                    Totaldata.Add(a1)
                End If
            Next
        End Sub
    供參考.


    Ader

    • 已標示為解答 willyaa 2019年12月14日 下午 12:36
    2019年12月14日 上午 09:15
  • 謝謝,問題已解決
    2019年12月14日 下午 12:58
  • Text/csv 的 oledb/odbc 驅動程式因為綁在 Access Runtime 上,又因為微軟政策同版本的 32/64 bits 不能裝在同一台,所以我個人不建議初學者用。

    很多人根本分不清楚編譯後的執行檔是跑哪種位元模式,也不清楚要對應 driver 版本跟新版的連線字串,要講清楚這中間變化跟講古一樣。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2019年12月14日 下午 04:56