我在正则表达方面不擅长。有人可以帮我写出正则表达式吗?
在阅读csv文件时,我可能会有这样的值。
"Artist,Name",Album,12-SCS "val""u,e1",value2,value3
输出:
Artist,Name Album 12-SCS Val"u,e1 Value2 Value3
更新: 我喜欢使用Oledb提供商的想法。我们在网页上有文件上传控制,我使用流阅读器读取文件的内容,而文件系统上没有实际的保存文件。有没有办法我可以使用Oledb提供程序,因为我们需要在连接字符串中指定文件名,在我的情况下,我没有在文件系统上保存文件。
答案 0 :(得分:14)
只需添加我今天早上工作的解决方案。
var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)");
foreach (Match m in regex.Matches("<-- input line -->"))
{
var s = m.Value;
}
如您所见,您需要每行调用regex.Matches() 。然后它将返回一个MatchCollection,其具有与列相同数量的项目。显然,每个匹配的Value属性是已解析的值。
这仍然是一项正在进行的工作,但它很乐意解析CSV字符串,如:
2,3.03,"Hello, my name is ""Joshua""",A,B,C,,,D
答案 1 :(得分:8)
实际上,很容易将CVS线与正则表达式相匹配。试试这个:
StringCollection resultList = new StringCollection();
try {
Regex pattern = new Regex(@"
# Parse CVS line. Capture next value in named group: 'val'
\s* # Ignore leading whitespace.
(?: # Group of value alternatives.
"" # Either a double quoted string,
(?<val> # Capture contents between quotes.
[^""]*(""""[^""]*)* # Zero or more non-quotes, allowing
) # doubled "" quotes within string.
""\s* # Ignore whitespace following quote.
| (?<val>[^,]*) # Or... zero or more non-commas.
) # End value alternatives group.
(?:,|$) # Match end is comma or EOS",
RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
Match matchResult = pattern.Match(subjectString);
while (matchResult.Success) {
resultList.Add(matchResult.Groups["val"].Value);
matchResult = matchResult.NextMatch();
}
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}
免责声明:正则表达式已在RegexBuddy中生成(生成此代码段),并且正确匹配OP测试数据,但C#代码逻辑未经测试。 (我无法访问C#工具。)
答案 2 :(得分:6)
答案 3 :(得分:5)
让TextFieldParser班看一看。它位于Microsoft.VisualBasic程序集中,并进行分隔和固定宽度解析。
答案 4 :(得分:1)
尝试CsvHelper(我维护的库)。它可以通过NuGet获得。
您可以轻松地将CSV文件读入自定义类集合。它也很快。
var streamReader = // Create a StreamReader to your CSV file
var csvReader = new CsvReader( streamReader );
var myObjects = csvReader.GetRecords<MyObject>();
答案 5 :(得分:-1)
正则表达式可能会变得过于复杂。在逗号上拆分行,然后迭代结果位并将它们连接起来“连接字符串中的双引号数”不均匀。
“你好,这个”,是“a”“测试”“”
... ...分割
“你好|这个”|是| “a”“test”“”
...迭代并合并'直到你有一个偶数个双引号......
“你好,这个” - 偶数引号(注意通过在位之间插入拆分删除逗号)
是 - 偶数引号
“a”“test”“” - 偶数引号
...然后剥离前导和尾随引用(如果存在)并将“”替换为“。
答案 6 :(得分:-1)
可以使用以下代码完成:
using Microsoft.VisualBasic.FileIO;
string csv = "1,2,3,"4,3","a,"b",c",end";
TextFieldParser parser = new TextFieldParser(new StringReader(csv));
//To read from file
//TextFieldParser parser = new TextFieldParser("csvfile.csv");
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
string[] fields =null;
while (!parser.EndOfData)
{
fields = parser.ReadFields();
}
parser.Close();