【问题标题】:Writing CSV Parser in C#用 C# 编写 CSV 解析器
【发布时间】:2018-11-13 23:52:49
【问题描述】:

我最近开始了一个项目,该项目在 CSV 文件中搜索重复条目并为用户提供删除一个或两个条目的选项。

看起来很简单,但是实际上将 CSV 文件解析到内存中的函数存在问题。

这是有问题的代码...

using System;
using System.IO;
using Microsoft.VisualBasic.FileIO;
using System.Collections.Generic;
using System.Windows.Forms;


public List<string[]> parseCSV(string path)
{
    List<string[]> parsedData = new List<string[]>();
    string[] fields;

    TextFieldParser parser = null;
    string line = parser.ReadLine();

    try
    {
        /*TextFieldParser*/ parser = new TextFieldParser(@"c:\temp\test.csv");
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");

        while (!parser.EndOfData)
        {
            fields = parser.ReadFields();
            parsedData.Add(fields);

            //Did more stuff here with each field.
        }

        parser.Close();

    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }

   return parsedData;
}

由于某种原因,在 VS2017 中,parseCSV 在函数声明中带有红色下划线。 我不明白为什么会这样。我已经尝试了明显的修复,例如将函数名称从 parseCSV 更改为其他名称,但显然没有。

【问题讨论】:

  • 错误是什么?
  • 我没有得到红色下划线,只是对命名约定的抱怨。
  • 如果您将鼠标悬停在波浪线上,您会看到一个错误。它是什么?我们不太擅长猜测这样的事情。只是它想让你把ParseCSV重命名为ParseCsv吗?如果是这样,请忽略它(后者是大多数约定的首选名称)。您是否收到任何错误或重要警告?
  • 你应该知道这一切以前都做过:有大量的 CSV 解析器可以做很棒的事情(比 VB 的事情更好)。参见 CSVHelper 示例
  • 当我将光标悬停在函数名称上时,我收到一条错误消息“List.ParseCSV(string path) 命名空间不能直接包含成员,例如领域或方法”。至于不满的评论。我知道有一百万个 CSV 解析器比我的要好得多,但就像我之前所说的,这主要是一个学习项目。如果这是我在专业环境中写的东西,我绝对会使用更好的选择。

标签: c# csv parsing


【解决方案1】:

在 C# 中,所有内容都包含在一个类中,您不能直接在命名空间中声明一个方法。

using System;
using System.IO;
using Microsoft.VisualBasic.FileIO;
using System.Collections.Generic;
using System.Windows.Forms;

class MyLearningOnlyCsvParser {

  public List<Customer_Data> parseCSV(string path)
  {
    List<Customer_Data> parsedData = new List<Customer_Data>();
    string[] fields;

    TextFieldParser parser = null;
    string line = parser.ReadLine();

    try
    {
        /*TextFieldParser*/ parser = new TextFieldParser(@"c:\temp\test.csv");
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");

        while (!parser.EndOfData)
        {
            fields = parser.ReadFields();

            // assume the CSV is always with  11 columns
            if(fields.length == 11) {
                Customer_Data newData = new Customer_Data();
                newData.name = fields[0];
                newData.company = fields[1];
                // assign to the rest of the customer data properties with each fields
                parsedData.Add(newData);
            }
            else {
                // error handling of not well formed CSV
            }

        }

        parser.Close();

    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }

   return parsedData;
  }
}

【讨论】:

  • 好的,谢谢你的提示。从历史上看,我主要使用 C++,所以其中一些对我来说是新的。
  • 这就是我目前所处的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多