Regex 在VB.net中将管道分隔文件更改为逗号分隔文件
因此,我有一组管道分隔输入,如下所示: “787291 | 3224325523”| 37826427 | 2482472 |“46284729 | 46246”124682 |82524 | 6846419 | 68247 我使用下面给出的代码将它们转换为逗号分隔的: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
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
作为分隔符创建的输入部分,
- 将固定的、重建的输入行保存到最终输出文件
当然,我不知道是否应该使用特定的编码。
在这里,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