vb.net 如何拆分文本文件
vb.net how to split text file
我有一个包含逗号分隔行的文件,如下所示:
PS23456789,08/2023,2011,LAM CHIUE MONG JP
sdad,08/2023,2011,LAM CHIUE MONG JP
xvczxcssf,08/2023,2011,LAM CHIUE MONG JP
42432,08/2023,2011,LAM CHIUE MONG JP
fdsafs,08/2023,2011,LAM CHIUE MONG JP
我想将此数据转换为固定长度值且没有逗号,如下所示:
PS23456789 08/2023 2011 LAM CHIUE MONG JP
sdad 08/2023 2011 LAM CHIUE MONG JP
xvczxcssf 08/2023 2011 LAM CHIUE MONG JP
42432 08/2023 2011 LAM CHIUE MONG JP
fdsafs 08/2023 2011 LAM CHIUE MONG JP
不幸的是,我只能让第一行看起来正确。其他的不工作。这是它的样子:
PS23456789 08/2023 2011 LAM CHIUE MONG JP
sdad08/2023 2011 LAM CHIUE MONG JP
xvczxcssf08/2023 2011 LAM CHIUE MONG JP
4243208/2023 2011 LAM CHIUE MONG JP
fdsafs08/2023 2011 LAM CHIUE MONG JP
这是我的代码:
Dim splitFile = File.ReadAllText(Result).Split(",")
For count = 0 To splitFile.Length - 1
While (splitFile(count).Length < 20)
splitFile(count) = splitFile(count) + " "
End While
totalFile += splitFile(count)
Next
My.Computer.FileSystem.WriteAllText("C:test.txt", totalFile, False)
我该如何解决这个问题?
这应该如你所愿:
''' <summary>
''' Removes delimiters from a file and makes all but the last column a fixed width.
''' </summary>
''' <param name="inputFilePath">
''' The path of the input file.
''' </param>
''' <param name="outputFilePath">
''' The path of the output file. Can be the same as the input file.
''' </param>
''' <param name="delimiter">
''' The field delimiter in the input file.
''' </param>
''' <param name="fieldWidth">
''' The width of the columns in the output file.
''' </param>
Private Sub MakeDelimitedFileFixedWidth(inputFilePath As String,
outputFilePath As String,
delimiter As String,
fieldWidth As Integer)
'The lines to write to the output file.
Dim outputLines As New List(Of String)
For Each line In File.ReadLines(inputFilePath)
'Split the existing line on the delimiter.
Dim fields = line.Split({delimiter}, StringSplitOptions.None)
'Pad all but the last column to the specified width.
For i = 0 To fields.Length - 2
fields(i) = fields(i).PadRight(fieldWidth)
Next
outputLines.Add(String.Concat(fields))
Next
'Write out the processed data.
File.WriteAllLines(outputFilePath, outputLines)
End Sub
这不会填充最后一列。如果需要,请将 fields.Length - 2
更改为 fields.Length - 1
或 fields.GetUpperBound(0)
.
在你的情况下,你可以这样称呼它:
MakeDelimitedFileFixedWidth(Result, "C:test.txt", ",", 20)
虽然我没有详细检查您现有的代码,但问题可能是您将现有数据作为单个块读取,然后在分隔符上将其拆分。这意味着您会将一行中的最后一个字段和下一行中的第一个字段一起作为一个值。这会对您的字段长度计算造成严重破坏。我提供的代码是逐行读取现有数据,所以这个问题不存在。
我认为那是因为您正在阅读所有的行作为一个整体。每行的结尾应该是一个\n
符号,因此第一行的最后一个字符串不能与第二行的第一个字符串分开。连接的字符串比您定义的长度(即 20)长,因此没有添加 space。您应该逐行读取文件并分别处理每一行。
顺便说一句,要添加尾随 space 以获得固定长度的字符串,您可能想尝试 String.Format,它的性能要好得多。
Check ref here. 示例:
String.Format({0:-20}, splitFile(count))
我有一个包含逗号分隔行的文件,如下所示:
PS23456789,08/2023,2011,LAM CHIUE MONG JP sdad,08/2023,2011,LAM CHIUE MONG JP xvczxcssf,08/2023,2011,LAM CHIUE MONG JP 42432,08/2023,2011,LAM CHIUE MONG JP fdsafs,08/2023,2011,LAM CHIUE MONG JP
我想将此数据转换为固定长度值且没有逗号,如下所示:
PS23456789 08/2023 2011 LAM CHIUE MONG JP sdad 08/2023 2011 LAM CHIUE MONG JP xvczxcssf 08/2023 2011 LAM CHIUE MONG JP 42432 08/2023 2011 LAM CHIUE MONG JP fdsafs 08/2023 2011 LAM CHIUE MONG JP
不幸的是,我只能让第一行看起来正确。其他的不工作。这是它的样子:
PS23456789 08/2023 2011 LAM CHIUE MONG JP sdad08/2023 2011 LAM CHIUE MONG JP xvczxcssf08/2023 2011 LAM CHIUE MONG JP 4243208/2023 2011 LAM CHIUE MONG JP fdsafs08/2023 2011 LAM CHIUE MONG JP
这是我的代码:
Dim splitFile = File.ReadAllText(Result).Split(",")
For count = 0 To splitFile.Length - 1
While (splitFile(count).Length < 20)
splitFile(count) = splitFile(count) + " "
End While
totalFile += splitFile(count)
Next
My.Computer.FileSystem.WriteAllText("C:test.txt", totalFile, False)
我该如何解决这个问题?
这应该如你所愿:
''' <summary>
''' Removes delimiters from a file and makes all but the last column a fixed width.
''' </summary>
''' <param name="inputFilePath">
''' The path of the input file.
''' </param>
''' <param name="outputFilePath">
''' The path of the output file. Can be the same as the input file.
''' </param>
''' <param name="delimiter">
''' The field delimiter in the input file.
''' </param>
''' <param name="fieldWidth">
''' The width of the columns in the output file.
''' </param>
Private Sub MakeDelimitedFileFixedWidth(inputFilePath As String,
outputFilePath As String,
delimiter As String,
fieldWidth As Integer)
'The lines to write to the output file.
Dim outputLines As New List(Of String)
For Each line In File.ReadLines(inputFilePath)
'Split the existing line on the delimiter.
Dim fields = line.Split({delimiter}, StringSplitOptions.None)
'Pad all but the last column to the specified width.
For i = 0 To fields.Length - 2
fields(i) = fields(i).PadRight(fieldWidth)
Next
outputLines.Add(String.Concat(fields))
Next
'Write out the processed data.
File.WriteAllLines(outputFilePath, outputLines)
End Sub
这不会填充最后一列。如果需要,请将 fields.Length - 2
更改为 fields.Length - 1
或 fields.GetUpperBound(0)
.
在你的情况下,你可以这样称呼它:
MakeDelimitedFileFixedWidth(Result, "C:test.txt", ",", 20)
虽然我没有详细检查您现有的代码,但问题可能是您将现有数据作为单个块读取,然后在分隔符上将其拆分。这意味着您会将一行中的最后一个字段和下一行中的第一个字段一起作为一个值。这会对您的字段长度计算造成严重破坏。我提供的代码是逐行读取现有数据,所以这个问题不存在。
我认为那是因为您正在阅读所有的行作为一个整体。每行的结尾应该是一个\n
符号,因此第一行的最后一个字符串不能与第二行的第一个字符串分开。连接的字符串比您定义的长度(即 20)长,因此没有添加 space。您应该逐行读取文件并分别处理每一行。
顺便说一句,要添加尾随 space 以获得固定长度的字符串,您可能想尝试 String.Format,它的性能要好得多。
Check ref here. 示例:
String.Format({0:-20}, splitFile(count))