如何使用 C# 在数据中使用逗号解析 CSV 中的数据?
How can I parse data in a CSV with C# with commas in the data?
我正在尝试解析数据中包含逗号的 CSV 文件。所有字段都没有引号,但是当其中有逗号时,一些美元金额会被引号括起来。例如,文件看起来像这样:
0000-0C,Sales-Data Entry,10/31/2016,000000,VJ,Comapny,,312.3
0000-0C,Sales-Data Entry,10/31/2016,000000,VJ,Company,,"1,420.97"
正如您所见,1,420.97 中有一个逗号,但它确实有引号。有没有办法可靠地读取此文件?
这是我的代码:
var path = @"glid.csv";
TextFieldParser parser = new TextFieldParser(path);
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
parser.ReadLine();
fields = parser.ReadFields();
//do something
}
parser.Close();
CSV 是一只叛逆的鸟,none 可以驯服,因此永远不要尝试用自己的规则解析它。
我强烈建议使用 OleDbDataAdapter
来填充数据集而不是 Microsoft.VisualBasic.FileIO.TextFieldParser
,这样可以节省您很多时间和麻烦。
string fileName = @"glid.csv";
DataSet ds = new DataSet("csvData");
string dir = Path.GetDirectoryName(fileName);
string connstr = String.Format("Provider = Microsoft.Jet.OleDb.4.0; Data Source={0}; Extended Properties = \"Text;HDR=YES;FMT=Delimited\"",dir);
using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection())
{
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(fileName), conn);
adapter.Fill(ds);
}
var p = ds; //<-- here is your data;
您确定要同时使用两者吗
parser.ReadLine();
和
fields = parser.ReadFields();
根据文档 https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(v=vs.110).aspx 这将跳过一行,一遍又一遍地处理下一行,直到文件结束。
您可能还希望检查您的编码类型,TextFieldParser 构造函数接受编码类型:https://msdn.microsoft.com/en-us/library/ms128085(v=vs.110).aspx
尝试以下编码:https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx
老实说,我建议使用 this nuget package。它对读取和写入 csv 非常有帮助,甚至允许您直接映射到 class 从您的记录创建对象模型。它将为您处理所有类似的转义和复杂的事情。简而言之,它就是有效。
这真是个好东西,而且非常好用!
我正在尝试解析数据中包含逗号的 CSV 文件。所有字段都没有引号,但是当其中有逗号时,一些美元金额会被引号括起来。例如,文件看起来像这样:
0000-0C,Sales-Data Entry,10/31/2016,000000,VJ,Comapny,,312.3
0000-0C,Sales-Data Entry,10/31/2016,000000,VJ,Company,,"1,420.97"
正如您所见,1,420.97 中有一个逗号,但它确实有引号。有没有办法可靠地读取此文件?
这是我的代码:
var path = @"glid.csv";
TextFieldParser parser = new TextFieldParser(path);
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
parser.ReadLine();
fields = parser.ReadFields();
//do something
}
parser.Close();
CSV 是一只叛逆的鸟,none 可以驯服,因此永远不要尝试用自己的规则解析它。
我强烈建议使用 OleDbDataAdapter
来填充数据集而不是 Microsoft.VisualBasic.FileIO.TextFieldParser
,这样可以节省您很多时间和麻烦。
string fileName = @"glid.csv";
DataSet ds = new DataSet("csvData");
string dir = Path.GetDirectoryName(fileName);
string connstr = String.Format("Provider = Microsoft.Jet.OleDb.4.0; Data Source={0}; Extended Properties = \"Text;HDR=YES;FMT=Delimited\"",dir);
using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection())
{
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(fileName), conn);
adapter.Fill(ds);
}
var p = ds; //<-- here is your data;
您确定要同时使用两者吗
parser.ReadLine();
和
fields = parser.ReadFields();
根据文档 https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(v=vs.110).aspx 这将跳过一行,一遍又一遍地处理下一行,直到文件结束。
您可能还希望检查您的编码类型,TextFieldParser 构造函数接受编码类型:https://msdn.microsoft.com/en-us/library/ms128085(v=vs.110).aspx
尝试以下编码:https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx
老实说,我建议使用 this nuget package。它对读取和写入 csv 非常有帮助,甚至允许您直接映射到 class 从您的记录创建对象模型。它将为您处理所有类似的转义和复杂的事情。简而言之,它就是有效。
这真是个好东西,而且非常好用!