【问题标题】:Get a single element of CSV file获取 CSV 文件的单个元素
【发布时间】:2013-03-06 21:39:54
【问题描述】:

我正在尝试将一些 csv 元素添加到 Alimento 列表中,其中 Alimento 声明为:

namespace ContaCarboidrati
{
    class Alimento
    {
       public virtual string Codice { get; set; }
       public virtual string Descrizione { get; set; }
       public virtual int Carboidrati { get; set; }
    }
}

我的 csv 看起来像这样:

"C00, Pasta, 75"

这是应该从 csv 创建列表的方法:

private static List<Alimento> CreaListaAlimentiDaCsv()
{        
   List<Alimento> listaCsv = new List<Alimento>();
   StreamReader sr = new StreamReader(@"C:\Users\Alex\Documents\RecordAlimenti.csv");
   string abc = sr.ReadLine();
   //listaCsv = abc.Split(",");
}

abc 是“C00,意大利面,75”。我想获取单个元素将其添加到列表中,或者将所有 3 个元素添加到列表中,我认为单个元素更容易制作。

对不起我的英语不好

提前致谢

亚历克斯

【问题讨论】:

  • Split 方法的注释代码有什么问题?拆分返回一个数组,所以 listaCsv[],但除此之外,它似乎很好。然后您将遍历数组并将每个项目分配给 Codice、Descrizione 和 Carboidrati。还是我误会了?
  • 要使用 CSV,最好使用一些库,例如 FileHelpers
  • CSV 记录可以跨越多行(你可以在引用的字段中换行),逐行阅读对你没有帮助。

标签: c# string list csv split


【解决方案1】:

你走在正确的轨道上,但你不能只创建一个包含三个字符串的 Alimento,如果你执行 abc.Split(",") 就会得到这样的结果。您需要为 csv 文件中的每个项目(行)创建一个新的 Alimento 对象,并正确初始化每个对象。像这样的:

var item = abc.Split(',');
listaCsv.Add(new Alimento() { Codice = item[0], Descrizione = item[1], 
Carboidrati = int.Parse(item[2])};

此外,您的 csv 似乎在逗号后包含您可能想要删除的空格。您可以使用 string.Trim() 摆脱前导/尾随空格。您还必须确保第三项实际上是一个整数,如果不是这种情况则采取措施(即添加一些错误处理)。

附带说明一下,实现一个 csv 阅读器并不像人们想象的那么简单,但是那里有几个免费的 C# 实现。如果您需要一些比阅读简单(且严格每项仅一行)csv 更高级的东西,请尝试以下方法之一:

【讨论】:

  • +1 提供了一个适合他现有代码的简单解决方案
  • 它给出了一个错误 con "var item = abc.Split(",");"论点 1:不可能从 "string" 转换为 "Char[]"
  • @user1711154 抱歉,改了代码,应该声明 abc.Split(','); IE。使用单引号。单引号将创建一个字符,这就是我们想要的。双引号 = 一个字符串。
  • 逗号不是必须的,我可以取消它们
  • 它工作得很好。多谢!这是最简单的方法,所以我标记为答案
【解决方案2】:

您可以使用 LINQ 解析文件

var listaCsv = (from line in File.ReadAllLines("RecordAlimenti.csv")
                let items = line.Split(',')
                select new Alimento {
                      Codice = items[0],
                      Descrizione = items[1],
                      Carboidrati = Int32.Parse(items[2])
                }).ToList();

【讨论】:

    【解决方案3】:

    假设你的数据不错,你可以很容易地解析它。

    private IEnumerable<Alimento> CreaListaAlimentiDaCsv(string fileName)
    {        
        return File.Readlines(fileName) //@"C:\Users\Alex\Documents\RecordAlimenti.csv"
                   .Select(line => line.Split(',').Trim())
                   .Select(
                        values =>
                            new Alimento
                                {
                                    Codice = value[0],
                                    Descrizione  = values[0],
                                    Carboidrati = Convert.ToInt32(values[3])
                                });
    }
    

    你也可以在方法上使用Linq比如

    //Takes one line without iterating the entire file
    CreaListaAlimentiDaCsv(@"C:\Users\Alex\Documents\RecordAlimenti.csv").Take(1); 
    
    //Skips the first line and takes the second line reading two lines total
    CreaListaAlimentiDaCsv(@"C:\Users\Alex\Documents\RecordAlimenti.csv").Skip(1).Take(1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2017-06-26
      相关资源
      最近更新 更多