【问题标题】:Using CSVHelper to read a CSV file and need to extract columns to arrays使用 CSVHelper 读取 CSV 文件并需要将列提取到数组中
【发布时间】:2020-02-04 13:40:43
【问题描述】:

我这里有这段代码可以按我的方式工作,但我正在.Net Standard 上开发,不能使用Microsoft.VisualBasic.FileIO 库。我希望能够使用CsvHelper 做同样的事情

是否可以使用CsvHelper 来,首先获取标题行作为字符串数组。其次,将每一行作为一个字符串数组来获取?

using Microsoft.VisualBasic.FileIO;

using (TextFieldParser csvParser = new TextFieldParser("FilePath"))
{
    csvParser.CommentTokens = new string[] { "#" };
    csvParser.SetDelimiters(new string[] { "," });
    csvParser.HasFieldsEnclosedInQuotes = true;
    csvParser.TrimWhiteSpace = true;

    string[] fields = csvParser.ReadFields();
    int arraySize = fields.Length;

    int index = Array.IndexOf(fields, columnExtracted);

    while (!csvParser.EndOfData)
    {
        fields = csvParser.ReadFields();
        string column = fields[index];
        Console.WriteLine(column);
    }
}

我尝试了以下代码来读取单元格,但由于 string Csv = string.Join("\n", result.ToArray()); 行而在遇到分隔符时会换行 有没有办法将所有信息放在一个数组中?它已经存储在字符串列表中,但我无法通过索引检索数据。

List<string> result = new List<string>();
string value;
using (TextReader fileReader = File.OpenText("FilePath"))
{
    var csv = new CsvReader(fileReader, CultureInfo.InvariantCulture);
    csv.Configuration.HasHeaderRecord = true;
    while (csv.Read())
    {
        for (int i = 0; csv.TryGetField<string>(i, out value); i++)
        {
            result.Add(value);
        }
        if (csv.Read() == false)
            break;
    }
}
string Csv = string.Join("\n", result.ToArray());

编辑

这是我收到反馈后的新代码。但是,它似乎在遍历存储所有记录的 List 时省略了标题行。

 public List<string> HeaderColumnParser(string columnExtracted, string PathToFile)
        {
            List<string> result = new List<string>();
            string value;
            using (TextReader fileReader = File.OpenText(PathToFile))
            {
                var csv = new CsvReader(fileReader, CultureInfo.InvariantCulture);

                csv.Read();
                csv.ReadHeader();
                string[] header = csv.Context.HeaderRecord;
                int extractedIndex = Array.IndexOf(header, columnExtracted);

                while (csv.Read())
                {
                    string[] row = csv.Context.Record;
                    string column = row[extractedIndex];
                    result.Add(column);
                }
            }
            return result;

【问题讨论】:

  • 您是否要求我们将此代码转换为使用 CSVHelper?
  • 没有必要。我在问是否可以使用 CSVHelper,因为它缺少文档
  • @GotBannedSoIma​​deAnotherAccount 如果你想将值作为一个数组,你为什么要将它们转换回 string? CsvHelper 的文档就足够了。它展示了如何读取强类型记录、单个字段、匿名对象、动态对象,甚至如何通过 CsvDataReader 将所有内容加载到 DataTable 中。您尝试做的事情很可能是不必要的。这段代码的作用是复制原始文件行,将 , 更改为 \n
  • @GotBannedSoIma​​deAnotherAccount 参考您最近的编辑,只需在while (csv.Read()) 之前添加result.Add(header[extractedIndex])

标签: c# .net csvhelper


【解决方案1】:

如果您希望每一行都作为字符串数组,这应该可以工作。

using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream))
using (StreamReader reader = new StreamReader(stream))
using (CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    writer.WriteLine("Id,Name,Column3,Column4,Column5");
    writer.WriteLine("1,One,Item1,Item2,Item3");
    writer.WriteLine("2,Two,Item4,Item5,Item6");
    writer.Flush();
    stream.Position = 0;
    reader.BaseStream.Position = 0;

    csv.Read();
    csv.ReadHeader();

    string[] header = csv.Context.HeaderRecord;
    var columnExtracted = "Column3";

    int extractedIndex = Array.IndexOf(header, columnExtracted);

    while (csv.Read())
    {
        string[] row = csv.Context.Record;
        var column = row[extractedIndex];
        Console.WriteLine(column);
    }
}
Console.ReadKey();

【讨论】:

  • 在回答之前检查问题的有效性,如果是,请检查是否重复。那么如果你什么都没有,我们很高兴看到你的回答:)
  • 我编辑了这个问题,以便更清楚地了解所问的内容。它只需要经过同行评审。
  • @DavidSpecht 我真的很感激这个答案。现在说得通了。只需获取我要提取的任何列标题的索引并传递给csv.Context.Record
  • @DavidSpecht 只是最后一个问题。调用csv.ReadHeader() 会读取标题行,然后转到下一行,这意味着它在返回或打印出来时不会成为数组的一部分。是否可以以某种方式包含它,或者我遗漏了一些东西。
  • @DavidSpecht 好的。我批准了你的编辑。同样通过OP的编辑,问题更加集中。至少,就我的意见而言,足够了。我投票重新提出这个问题。让我们看看:)
猜你喜欢
  • 2021-10-02
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多