解析一个麻烦的.CSV文件

时间:2015-01-29 15:58:38

标签: c# csv datagridview

我正在为我爸爸制作一个.CSV解析器,因为他正在从他购买商品的地方收到一个几乎无法读取的文件。

看,我的问题是这样的:

  1. 商店非常友好地制作分隔符“,”并且仍然使用它来分隔小数值。
  2. 所有内容都包含在“引号”中,我很想知道如何删除它们
  3. 直到现在我一直在使用StreamReader来读取我的文件,并显示它我正在使用DataGridView。我的代码如下:http://dumptext.com/E9GcAfyW

    编辑:问题是这样的:当我尝试用我当前的代码解析文件时,我得到一个错误,说明数组对于指定的列太长,从而崩溃。这是因为.CSV文件使用“,”作为分隔符,并且仍然使用逗号作为十进制值的分隔符(例如25,3)。另一个问题是因为当我解析文件的一块时,它运行良好,但所有元素都用引号括起来,我希望从DataGridView中删除它。 这是我的窗口,当我删除额外的逗号,以便解析器工作: http://puu.sh/fbXlt/35aaf37e33.png

2 个答案:

答案 0 :(得分:0)

我有一个类似的CSV文件,最后我使用TextFieldParser来提取数据。您仍然需要解析CSV列数据:

private void GetCSVData(string CsvFileFullPath)
{
    // Make sure that you add the Microsoft.VisualBasic.FileIO Namespace

    using (var lines = new TextFieldParser(CsvFileFullPath))
    {
        lines.HasFieldsEnclosedInQuotes = true;
        lines.SetDelimiters(",");
        lines.TrimWhiteSpace = true;

        try
        {
            while (!lines.EndOfData)
            {
                string[] csvLineCols = lines.ReadFields();

                for (int i = 0; i < csvLineCols.Count(); i++)
                {
                    Console.WriteLine(csvLineCols[i].ToString());
                }
            }
        }
        catch
        { }
    }
}

答案 1 :(得分:0)

如果您需要将其绑定到DataGrid,最好将其解析为List。如果您需要数据类型安全,则由您决定如何相应地解析数据。

此示例使用NuGet包CsvHelper。

WebClient webClient = new WebClient();
TextReader textReader = new StreamReader(new MemoryStream(
                webClient.DownloadData("http://selfservice.diges.dk:9080/selfservice/download/prisbog/VARPOST.CSV")));
 var csvReader = new CsvParser(textReader);

 List<Record> records = new List<Record>();
 while (true)
 {
     var row = csvReader.Read();
     if (row == null)
     {
         break;
     }

     records.Add(new Record()
     {
         Column1 = row[0],
         Column2 = row[1],
         Column3 = row[2],
         Column4 = row[3],
         Column5 = row[4],
         Column6 = row[5],
         Column7 = row[6]
     });
 }

public class Record
{
    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
    public string Column4 { get; set; }
    public string Column5 { get; set; }
    public string Column6 { get; set; }
    public string Column7 { get; set; }
}