将管道分隔文件更改为 VB.net 中的逗号分隔文件
Changing a pipe delimited file to comma delimited in VB.net
所以我有一组管道分隔的输入,它们是这样的:
"787291 | 3224325523" | 37826427 | 2482472 | "46284729|46246" | 24682
| 82524 | 6846419 | 68247
我正在使用下面给出的代码将它们转换为逗号分隔:
Dim line As String
Dim fields As String()
Using sw As New StreamWriter("c:\test\output.txt")
Using tfp As New FileIO.TextFieldParser("c:\test\test.txt")
tfp.TextFieldType = FileIO.FieldType.Delimited
tfp.Delimiters = New String() {"|"}
tfp.HasFieldsEnclosedInQuotes = True
While Not tfp.EndOfData
fields = tfp.ReadFields
line = String.Join(",", fields)
sw.WriteLine(line)
End While
End Using
End Using
到目前为止一切顺利。它只考虑引号外的定界符并将它们更改为逗号定界符。但是当我输入如下的杂散引号时,麻烦就开始了:
"787291 | 3224325523" | 37826427 | 2482472 | "46284729|46246" | 24682
| "82524 | 6846419 | 68247
这里的代码给出了
MalformeLineExcpetion
我意识到这是由于我输入中的杂散引号,因为我在 RegEx 中完全是菜鸟所以我不能在这里使用它(或者我不能)。如果有人有任何想法,将不胜感激。
这是评论中描述的编码过程:
- 读取原始输入文件的所有行,
- 修复错误的行(使用 Regex 或任何其他适合的方法),
- 使用
TextFieldParser
执行正确输入的解析
Join()
TextFieldParser
使用 ,
作为分隔符创建的输入部分
- 将固定的重构输入行保存到最终输出文件
我正在使用 正则表达式模式:根据问题描述,它看起来应该可以工作。
注:
当然我不知道是否应该使用特定的Encoding。
在这里,Encoding is the defaultUTF-8 no-BOM
,进进出出。
"FaultyInput.txt"
是 损坏的 源文件。
"FixedInput.txt"
是包含正则表达式修复(希望)的输入行的文件。您也可以使用 MemoryStream
.
"FixedOutput.txt"
是最终的 CSV
文件,包含逗号分隔的字段和正确的值。
这些文件都在read/written可执行启动路径中
Dim input As List(Of String) = File.ReadAllLines("FaultyInput.txt").ToList()
For line As Integer = 0 To input.Count - 1
input(line) = Regex.Replace(input(line), "(""\b.*?\b"")|""", "")
Next
File.WriteAllLines("FixedInput.txt", input)
Dim output As List(Of String) = New List(Of String)
Using tfp As New FileIO.TextFieldParser("FixedInput.txt")
tfp.TextFieldType = FileIO.FieldType.Delimited
tfp.Delimiters = New String() {"|"}
tfp.HasFieldsEnclosedInQuotes = True
While Not tfp.EndOfData
Dim fields As String() = tfp.ReadFields
output.Add(String.Join(",", fields))
End While
End Using
File.WriteAllLines("FixedOutput.txt", output)
'Eventually...
'File.Delete("FixedInput.txt")
Sub ReadMalformedCSV()
Dim s$
Dim pattern$ = "(?x)" + vbCrLf +
"\b #word boundary" + vbCrLf +
"(?'num'\d+) #any number of digits" + vbCrLf +
"\b #word boundary"
'// Use "ReadLines" as it will lazily read one line at time
For Each line In File.ReadLines("c:\test\output.txt")
s = String.Join(",", Regex.Matches(line, pattern).
Select(Function(e) e.Groups("num").Value))
WriteLine(s)
Next
End Sub
所以我有一组管道分隔的输入,它们是这样的:
"787291 | 3224325523" | 37826427 | 2482472 | "46284729|46246" | 24682 | 82524 | 6846419 | 68247
我正在使用下面给出的代码将它们转换为逗号分隔:
Dim line As String
Dim fields As String()
Using sw As New StreamWriter("c:\test\output.txt")
Using tfp As New FileIO.TextFieldParser("c:\test\test.txt")
tfp.TextFieldType = FileIO.FieldType.Delimited
tfp.Delimiters = New String() {"|"}
tfp.HasFieldsEnclosedInQuotes = True
While Not tfp.EndOfData
fields = tfp.ReadFields
line = String.Join(",", fields)
sw.WriteLine(line)
End While
End Using
End Using
到目前为止一切顺利。它只考虑引号外的定界符并将它们更改为逗号定界符。但是当我输入如下的杂散引号时,麻烦就开始了:
"787291 | 3224325523" | 37826427 | 2482472 | "46284729|46246" | 24682 | "82524 | 6846419 | 68247
这里的代码给出了
MalformeLineExcpetion
我意识到这是由于我输入中的杂散引号,因为我在 RegEx 中完全是菜鸟所以我不能在这里使用它(或者我不能)。如果有人有任何想法,将不胜感激。
这是评论中描述的编码过程:
- 读取原始输入文件的所有行,
- 修复错误的行(使用 Regex 或任何其他适合的方法),
- 使用
TextFieldParser
执行正确输入的解析 Join()
TextFieldParser
使用,
作为分隔符创建的输入部分- 将固定的重构输入行保存到最终输出文件
我正在使用
注:
当然我不知道是否应该使用特定的Encoding。
在这里,Encoding is the defaultUTF-8 no-BOM
,进进出出。
"FaultyInput.txt"
是 损坏的 源文件。
"FixedInput.txt"
是包含正则表达式修复(希望)的输入行的文件。您也可以使用 MemoryStream
.
"FixedOutput.txt"
是最终的 CSV
文件,包含逗号分隔的字段和正确的值。
这些文件都在read/written可执行启动路径中
Dim input As List(Of String) = File.ReadAllLines("FaultyInput.txt").ToList()
For line As Integer = 0 To input.Count - 1
input(line) = Regex.Replace(input(line), "(""\b.*?\b"")|""", "")
Next
File.WriteAllLines("FixedInput.txt", input)
Dim output As List(Of String) = New List(Of String)
Using tfp As New FileIO.TextFieldParser("FixedInput.txt")
tfp.TextFieldType = FileIO.FieldType.Delimited
tfp.Delimiters = New String() {"|"}
tfp.HasFieldsEnclosedInQuotes = True
While Not tfp.EndOfData
Dim fields As String() = tfp.ReadFields
output.Add(String.Join(",", fields))
End While
End Using
File.WriteAllLines("FixedOutput.txt", output)
'Eventually...
'File.Delete("FixedInput.txt")
Sub ReadMalformedCSV()
Dim s$
Dim pattern$ = "(?x)" + vbCrLf +
"\b #word boundary" + vbCrLf +
"(?'num'\d+) #any number of digits" + vbCrLf +
"\b #word boundary"
'// Use "ReadLines" as it will lazily read one line at time
For Each line In File.ReadLines("c:\test\output.txt")
s = String.Join(",", Regex.Matches(line, pattern).
Select(Function(e) e.Groups("num").Value))
WriteLine(s)
Next
End Sub