我有一个CSV文件,如下所示:
ID,Name,Address,PhoneNumber
101,Jack,"No 13, HillTop, London",012346789
102,Harry,"No 15, Baker Street London",012346789
我需要读取所有列(逗号分隔)。当我使用split函数时,它也会分割地址。我想分割除双引号地址之外的任何内容。
答案 0 :(得分:3)
即使您使用的是C#,Microsoft.VisualBasic命名空间中也有一个非常有用的类TextFieldParser
。除 using
指令外,您还需要添加对项目的引用:
using Microsoft.VisualBasic.FileIO;
然后你可以实现类似如下的内容:
private void Parse()
{
using (TextFieldParser parser = new TextFieldParser("file.csv")
{
HasFieldsEnclosedInQuotes = true,
Delimiters = new string[] {
","
}
})
{
string[] fields;
do
{
fields = parser.ReadFields();
PrintResults(fields);
}
while (fields != null);
}
}
private void PrintResults(string[] fields)
{
if (fields != null)
{
foreach (var field in fields)
{
Console.Write(string.Concat("[", field, "] "));
}
Console.WriteLine();
}
}
您的案例中HasFieldsEnclosedInQuotes = true
的{{1}}属性必须设置为实现所需的行为。
我已将您的CSV示例数据放入文件中并作为测试运行。我开始使用的数据是(在一个名为" file.csv"的本地文件中):
TextFieldParser
通过调用上面的ID,Name,Address,PhoneNumber
101,Jack,"No 13, HillTop, London",012346789
102,Harry,"No 15, Baker Street London",012346789
方法,控制台中的结果输出是:
Parse()
答案 1 :(得分:0)
使用建议的解析库的替代方法可以使用REGEX。
解析此字符串所需的表达式,考虑到“xx,xx”情况为(".*"|.*?)(,|$)
。
在C#中使用它的示例代码:
//preparation
var pattern = @"("".*""|.*?)(,|$)";
var regex = new Regex(pattern);
//for each file line
var text =@"101,Jack,""No 13, HillTop, London"",0123456789";
var matches = regex.Matches(text).Cast<Match>().Select(m=>m.Groups[1].Value);