【问题标题】:Parsing CSV data解析 CSV 数据
【发布时间】:2014-11-24 11:10:36
【问题描述】:

我正在尝试解析带有数据的 CSV 文件,但没有成功,我在网上尝试了一堆工具,但没有一个能够正确解析 CSV 文件。我对我在这里寻求帮助这一事实感到困惑,因为有人会认为解析 CSV 数据会非常容易。

CSV数据的格式是这样的:

",95,54070,3635,""Test Reservation"",0,102,0.00,0.00,2014-12-31,""Name of customer"",""$12.34 + $10, special price"",""extra information"",,CustomerName,,,,,1234567890,youremail@domain.com,CustomerName,2014-12-31,23:59:59,16,0,60,2,120,0,NULL,NULL,NULL,"

当前代码:

private void btnOpenFileDialog_Click(object sender, EventArgs e)
    {
        DialogResult result = openFileDialog1.ShowDialog();

        if (result == DialogResult.OK)
        {
            using (StreamReader reader = new StreamReader(openFileDialog1.FileName))
            {
                string line;

                while ((line = reader.ReadLine()) != null)
                {
                    ParseCsvLine(line);
                }
            }
        }
    }

    private void ParseCsvLine(string line)
    {
        if (line != string.Empty)
        {
            string[] result;

            using (var csvParser = new TextFieldParser(new StringReader(line)))
            {
                csvParser.Delimiters = new string[] { "," };

                result = csvParser.ReadFields();
            }

            foreach (var item in result)
            {
                Console.WriteLine(item + Environment.NewLine);
            }
        }
    }

结果变量只有一项及其:

,95,54070,3635,"Test Reservation",0,102,0.00,0.00,2014-12-31,"Name of customer","$12.34 + $10, special price","extra information",,CustomerName,,,,,1234567890,youremail@domain.com,CustomerName,2014-12-31,23:59:59,16,0,60,2,120,0,NULL,NULL,NULL,

【问题讨论】:

  • 通过编写解析器或使用库。
  • 好吧,您的分隔符在您的示例中似乎是一个逗号,并且您在拆分命令中使用了一个制表符。

标签: c# csv stringreader textfieldparser


【解决方案1】:
// Add Microsoft.VisualBasic.dll to References.
using Microsoft.VisualBasic.FileIO; 

// input is your original line from csv.

// Remove starting and ending quotes.
input = input.Remove(0, 1);
input = input.Remove(input.Length - 1);

// Replace double quotes with single quotes.
input = input.Replace("\"\"", "\"");

string[] result;
using (var csvParser = new TextFieldParser(new StringReader(input)))
{
    csvParser.Delimiters = new string[] { "," };
    result = csvParser.ReadFields();
}   

【讨论】:

  • 米海还有什么建议吗?
  • @user2595352,是的,刚刚发布了我的编辑:) 你必须删除双引号并用单引号替换它们。另外,我已经从你的行中删除了开始和结束的引号。这有点乱。也许还有另一种解决方案。
  • 是的,这一切似乎都正确! :) 我很困惑为什么这似乎是一项如此复杂的任务,我的意思是我认为 CSV 有某种标准并且易于阅读。谢谢大家的帮助!
  • @user2595352,好吧,我认为您遇到此类问题的频率可能会超出您的预期。不过我同意你的看法。请不要忘记accept the answer
【解决方案2】:

您可以查看以前的帖子,该帖子处理 csv 文件中那些讨厌的逗号。我正在链接它here

另外,Mihai,您的解决方案仅适用于一行,但一旦有很多行要解析,就会失败。

【讨论】:

  • 不,我认为它不会失败。只需将解决方案提取到一个接受string 并返回string[] 的函数中。另外,您的帖子不是答案。您应该为此使用 cmets。
猜你喜欢
  • 1970-01-01
  • 2021-08-05
  • 2013-08-24
  • 2016-11-25
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多