【问题标题】:Comma Separated text file to Generic List逗号分隔的文本文件到通用列表
【发布时间】:2012-09-15 06:01:52
【问题描述】:

将逗号分隔的文本文件转换为通用列表有点麻烦。我有一个使用以下属性定义的类(称为“客户”):

  • 名称(字符串)
  • 城市(字符串)
  • 余额(双)
  • 卡号(整数)

这些值将以这种格式存储在文本文件中:姓名、城市、余额、车号,例如约翰,孟菲斯,10,200789。会有多行这样的。我想要做的是在用户单击按钮时将每一行放在一个列表项中。

我已经知道我可以使用 .Split() 方法分解每一行,但不知道如何使正确的值进入列表的正确属性。 (请注意:我知道如何使用 get/set 属性,我不允许使用 LINQ 来解决问题)。

感谢任何帮助,因为我只是在学习并且已经为此工作了一段时间,但没有运气。谢谢

编辑:
抱歉,看来我没有说清楚。我知道如何使用 .add。 如果我在文本文件中有两行: A,B,1,2 和 C,D,3,4 我不知道该怎么做是让位置0的列表项中的名称“field”等于“A”,位置1的项目中的名称“field”等于“C”等等。

抱歉,术语使用不当,我只是在学习。希望你明白我在问什么(我相信一旦你知道它真的很容易做到)

【问题讨论】:

  • "但不知道如何让正确的值进入列表的正确属性" --- 使用=?
  • readline - foreach - new object() - list.Add?

标签: c# list generics comma


【解决方案1】:

string.Split 的结果会给你一个字符串数组:

string[] lineValues = line.Split(',');

您可以通过索引访问数组中的值:

string name = lineValues[0];
string city = lineValues[1];

您可以使用它们各自的Parse 方法将字符串转换为doubleint

double balance = double.Parse(lineValues[2]);
int cardNumber = int.Parse(lineValues[3]);

您可以实例化该类并非常简单地分配给它:

Customer customerForCurrentLine = new Customer()
{
    Name = name,
    City = city,
    Balance = balance,
    CardNumber = cardNumber,
};

只需遍历这些行,为该行实例化一个 Customer,并将其添加到您创建的 List<Customer> 类型的变量中

如果您希望您的程序是防弹的,您将不得不进行大量检查以跳过没有足够值的行,或者无法解析为正确数字类型的行。例如,检查lineValues.Length == 4 并使用int.TryParse(...)double.TryParse(...)

【讨论】:

    【解决方案2】:

    读取文件并根据换行符拆分其文本。然后,对于总行数,运行一个循环,该循环将基于逗号拆分并创建一个新对象并在其属性中插入值并将该对象添加到列表中。

    这边

    List<Customers> lst = new List<Customers>();
    
    string[] str = System.IO.File.ReadAllText(@"C:\CutomersFile.txt")
                                 .Split(new string[] { Environment.NewLine }, 
                                                       StringSplitOptions.None);
    
    for (int i = 0; i < str.Length; i++)
    {
        string[] s = str[i].Split(',');
    
        Customers c = new Customers();
    
        c.Name = s[0];
        c.City = s[1];
        c.Balance = Convert.ToDouble(s[2]);
        c.CardNumber = Convert.ToInt32(s[3]);
    
        lst.Add(c);
    }
    

    BTW 类名应该是Customer 而不是Customers

    【讨论】:

    • ReadAllText.Split 使用太多内存,速度很慢。一次读一行。
    【解决方案3】:

    Split() 按照它们在源字符串中出现的顺序生成一个字符串数组。因此,如果您的名称字段是 CSV 文件中的第一列,那么它将始终是数组中的第一个索引。

    someCustomer.Name = splitResult[0];
    

    等等。您还需要为您的类的数字类型属性调查 String.TryParse。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多