我有一个格式不正确的 CSV 文件,我需要寻找额外的引号。
这是它的样子:
"1","title","desc desc dejdg sdjgh djhg"
"2","title2","desc jhgdj "jhsgfjhsgd" jhgd"
^^^^^^^^^^^^
我需要寻找之前"
没有的任何东西,
:
(\")(?!\,)
这意味着寻找任何"
没有正确之后的东西,
,但我不知道如何,
在"
.
我有一个格式不正确的 CSV 文件,我需要寻找额外的引号。
这是它的样子:
"1","title","desc desc dejdg sdjgh djhg"
"2","title2","desc jhgdj "jhsgfjhsgd" jhgd"
^^^^^^^^^^^^
我需要寻找之前"
没有的任何东西,
:
(\")(?!\,)
这意味着寻找任何"
没有正确之后的东西,
,但我不知道如何,
在"
.
您要求的正则表达式是
(?<!,)"
或者,如果您不反对匹配超出您的需要,您可以使用
(^|[^,])"
这将匹配前面的非逗号以及双引号,但对它的支持应该更广泛(不包括findstr
)。
但是,对于解析 CSV 文件,您应该使用适当的解析器作为任何基于正则表达式的解决方案(至少我目前看到的用于此任务的解决方案)是
关于什么
[^,](\")
?
请注意,这不会检测行首的引号(从技术上讲,它是不以逗号开头的引号),但对于您的使用来说,这很好,因为行首的引号不是错误CSV 文件。
在 .NET 中,您可以使用TextFieldParser 类。添加Microsoft.VisualBasic
对您项目的引用并尝试以下操作:
using System;
using System.Linq;
using Microsoft.VisualBasic.FileIO;
class Program
{
static void Main(string[] args)
{
using (var tfp = new TextFieldParser("input.txt"))
{
tfp.Delimiters = new string[] { "," };
tfp.HasFieldsEnclosedInQuotes = false;
while (!tfp.EndOfData)
{
var fields = tfp.ReadFields();
fields.ToList().ForEach(field =>
{
Console.WriteLine(field);
});
}
}
}
}