将管道分隔文件更改为 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