Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在VB.net中将管道分隔文件更改为逗号分隔文件_Regex_Vb.net_Delimiter_Delimited - Fatal编程技术网

Regex 在VB.net中将管道分隔文件更改为逗号分隔文件

Regex 在VB.net中将管道分隔文件更改为逗号分隔文件,regex,vb.net,delimiter,delimited,Regex,Vb.net,Delimiter,Delimited,因此,我有一组管道分隔输入,如下所示: “787291 | 3224325523”| 37826427 | 2482472 |“46284729 | 46246”124682 |82524 | 6846419 | 68247 我使用下面给出的代码将它们转换为逗号分隔的: Dim line As String Dim fields As String() Using sw As New StreamWriter("c:\test\output.txt") Usin

因此,我有一组管道分隔输入,如下所示:

“787291 | 3224325523”| 37826427 | 2482472 |“46284729 | 46246”124682 |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”124682 |“82524| 6846419 | 68247

这里代码给出了

畸形脱皮


我意识到这是由于我的输入中有错误的引用,因为我像RegEx中的一个完全的noob,所以我不能在这里使用它(或者我不能)。如果有人有任何想法,我将不胜感激。

以下是注释中描述的编码过程:

  • 读取原始输入文件的所有行
  • 修复故障线路(使用正则表达式或任何其他合适的工具)
  • 使用
    TextFieldParser
    对正确的输入进行解析
  • Join()
    TextFieldParser
    使用
    作为分隔符创建的输入部分
  • 将固定的、重建的输入行保存到最终输出文件
我使用的是Regex模式:根据问题的描述,它看起来应该可以工作

注意
当然,我不知道是否应该使用特定的编码。
在这里,UTF-8无BOM进出

“FaultyInput.txt”
是损坏的源文件。
“FixedInput.txt”
是包含正则表达式(希望)修复的输入行的文件。您也可以使用
MemoryStream

“FixedOutput.txt”
是最终的
CSV
文件,包含逗号分隔的字段和正确的值

这些文件都是在可执行启动路径中读取/写入的

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"")|""", "$1")
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")

请尝试
Regex.Replace(第行“(“\b.*?\b”))|“,“$1”)
我不确定我是否理解,因为我必须将这行代码放在“第行”被分配一个字符串值之后,该字符串值不会发生,因为代码在“ReadFields”处出现异常,因此阻止了“第行”“从一开始就用任何值填充。您必须读取输入,对其进行正则化(或使用您可以使用的任何其他工具),然后使用
TextFieldParser
解析固定输入。但是,修复生成错误字符串的实际源应该是一项优先任务。难道不可能修复吗?是“应该在那儿吗?它在第一个、第二个、最后一个数字之后结束吗?没有办法知道。@我知道的荷花,它永远不会结束。正如我所说,这只是一个流浪者,不幸的是,我对此无能为力,因为这是我得到的输入。什么也做不到。在您的答案中添加一些解释将有助于提问者理解此代码,并为未来的访问者提供此问题的价值。非常感谢,目前为止,它正在发挥作用。我将用不同的输入测试它,看看它是否能正常工作。但说真的,伙计,我对你感激不尽。非常感谢你的帮助。
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