0

これは、分割したいテキスト行、data.txt (いくつかのテキスト ファイル) です。

AAEJEY CONSUMER COMPANY                    61469 HH13811 4796000501758   NILMA LIQUID BLUE                240 75ML         960.00  20131002
EVERGREEN MARKETING                        61485 PC21946 3014260818685   ORALB 7 BENEFITS T/BRUSH          12 EACH         120.00  20131002
HARISCHANDRA MILLS PLC                     61488 BV50201 4792083040122   HARISCHANDRA COFFEE               40 50GR        4000.00  20131002

「COMPANY」と「61469」の間のスペースの長さは、行ごとに異なる場合があります。 その行を次のように分割したいと思います。

AAEJEY コンシューマーカンパニー

61469

HH13811

4796000501758

ニルマ リキッドブルー

240

75ML

960.00

20131002

これは私のコードです。スペースですべて分割されていますが、会社名 (AAEJEY CONSUMER COMPANY) を単一の名前として取得することも、アイテム名 (NILMA LIQUID BLUE) を単一の名前として取得することもできません。

Dim myArray() As String, delimiter As Char = " "
        Dim strBuild As String = ""
        Dim b As Boolean = False
        Dim i As Integer = 0
        Try
            Using sr As New StreamReader(fileName)
                Dim line As String
                While Not sr.EndOfStream
                    line = sr.ReadLine()
                    Console.WriteLine(line)
                    myArray = line.Split(delimiter)
                    Dim order As New OrdData()
                    For index As Integer = 0 To myArray.Length - 1
                        If myArray(index) = "" Then
                            i = index
                            myArray.Skip(1)                                
                        Else                               
                            strBuild += myArray(index) + " "
                            Console.WriteLine(strBuild)
                        End If

                    Next
                End While
            End Using
        Catch e As Exception
            Console.WriteLine("The file could not be read:")
            Console.WriteLine(e.Message)
        End Try
4

2 に答える 2

2

You could try this handy functional approach.

First define a function to recursively split a line:

Dim f As Func(Of String, IEnumerable(Of Integer), IEnumerable(Of String)) = Nothing
f = Function(t, ns)
    If ns.Any() Then
        Dim n = ns.First()
        Dim i = System.Math.Min(n, t.Length)
        Dim t0 = t.Substring(0, i)
        Dim t1 = t.Substring(i)
        Return New List(Of String) From { t0.Trim() }.Concat(f(t1, ns.Skip(1)))
    Else
        Return New List(Of String) From { t.Trim() }
    End If
End Function

Then define your splits like this:

Dim splits = { 43, 6, 8, 16, 31, 6, 10, 11 }

Now you can run it like this:

Dim fields = f(line, splits).ToArray()

Given your first line of data I got this result:

result

于 2013-10-30T02:52:22.817 に答える
2

固定長のファイル形式のように見えるので、実際には文字数を指定する必要があります。

line = sr.ReadLine()
var name = line.Substring(0, 43).Trim();
var number = line.Substring(44, 5).Trim();

ファイルに区切り記号がありません。スペースは項目 (最初の列) の一部であるため、スペースを使用することはできません。

于 2013-10-30T02:12:05.830 に答える