0

我正在尝试解析数据中带有逗号的 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();
4

3 回答 3

3

您确定要同时使用两者吗

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

于 2017-01-18T13:49:01.097 回答
3

CSV 是一只叛逆的鸟,没有人可以驯服,因此永远不要尝试用自己的规则来解析它。

我强烈建议使用 OleDbDataAdapter来填充 Dataset 而不是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;
于 2017-01-18T13:34:11.910 回答
0

老实说,我建议使用这个 nuget package。它对读取和写入 csv 都非常有帮助,甚至允许您直接映射到从记录中创建对象模型的类。它将为您处理所有类似的转义和复杂的事情。简而言之,它只是有效。

这真的是好东西,而且很容易使用!

于 2017-01-18T13:58:22.857 回答