【问题标题】:Reading from a csv file and processing it in .net从 csv 文件中读取并在 .net 中处理它
【发布时间】:2015-07-15 11:53:24
【问题描述】:

我有一个包含 2 行的 csv 文件。

 A,1
 B,2

我想读取该格式的文件,并将其转换为以下格式:

Name : A, ID: 1
Name : B, ID: 2

我正在使用以下 .net api

using (FileStream reader = File.OpenRead(@"Data.csv")) // mind the encoding - UTF8
            using (TextFieldParser parser = new TextFieldParser(reader))
            {
                parser.TrimWhiteSpace = true; // if you want
                parser.Delimiters = new[] { "," };
                parser.HasFieldsEnclosedInQuotes = true;
                while (!parser.EndOfData)
                {
                    string[] line = parser.ReadFields();

                    List<string> li = line.SelectMany(x => x.Split(',')).ToList();


                }
            }

在 li 变量中,我可以在拆分后获取单个元素,例如:A 1,但我不知道如何向其中添加 key 属性,以使名称:A,ID:1

编辑:

我最终需要它以列表格式,因为它很容易根据它来分离实体 例如:

List{
    List1 = Name : A,ID:1
    List2 = Name : B,ID:2
}

【问题讨论】:

  • 您应该考虑使用CSVHelper 库来读取和处理CSV 文件。
  • 解析第一行时(例如)parser.ReadFields(); 会返回什么?
  • 那么如果TextFieldParser 类为您提供StreamReader.ReadLine() 的确切结果,那么它的优势是什么?
  • 这个函数 ReadFields();将输出为 A,1。读取数据不是这里的问题,它只是对它的后处理

标签: c# .net csv c#-4.0 c#-3.0


【解决方案1】:

我会为此创建结构:

struct ValuePair
{
    public string Name  { get; set; }
    public string Id { get; set; }        

    public ValuePair(string name, string id) : this()
    {
        Name = name;
        Id = id;
    }

    public override string ToString()
    {
        return "Name : " + Name + ", Id : " + Id;
    }
}

您可以在您的代码中使用它:

List<ValuePair> data = new List<ValuePair>();
for(int i = 0; i < li.Count; i += 2) 
   data.Add(new ValuePair(li[i], li[i + 1]));

然后使用data[i].ToString();

【讨论】:

    【解决方案2】:

    您需要自己构建输出字符串...

    StringBuilder sb = newStringBuilder();
    using (FileStream reader = File.OpenRead(@"Data.csv")) // mind the encoding - UTF8
            using (TextFieldParser parser = new TextFieldParser(reader))
            {
                parser.TrimWhiteSpace = true; // if you want
                parser.Delimiters = new[] { "," };
                parser.HasFieldsEnclosedInQuotes = true;
                while (!parser.EndOfData)
                {
                    string[] line = parser.ReadFields();
    
                    List<string> li = line.SelectMany(x => x.Split(',')).ToList();
    
                    sb.AppendLine(String.Format("Name: {0}, ID: {1}", li[0],li[1]));
    
                }
            }
    MessageBox.Show(sb.ToString());
    

    请注意,您可能想用"" 分隔(文本)值(假设您想从新格式中读取),并且您还需要决定一个合适的方案来转义" 时它出现在值中。 执行此操作的常用方法是将值中的每个 " 替换为 ""

    例如 第一个值,1 第二个“第二个”值,2

    将映射到

    Name: "FirstValue", ID:1
    Name: "Sec""ond""Value", ID:2
    

    如果您不这样做,那么从您的新格式回读可能是不确定的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2017-04-24
      • 2020-12-08
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2011-09-27
      相关资源
      最近更新 更多