想知道如何使用现有代码(C#)将新列添加到CSV文件

时间:2019-06-04 14:22:36

标签: c# .net-core

下面有一些代码,我在这些文件中读取文件,然后在控制台应用程序上将其写出,然后将其写入对值进行重新排序的同一文件中。我当前的问题是添加一个新列(第4列),并将重新排序的数据写入该新列,同时将旧数据保留为原始格式。

如果有任何后果,我将在Excel中打开CSV。

我已经尝试过这些StackOverflow和ASP论坛网站的问题的答案,但是我想这里的主要问题是代码的位置。

c# Add a Column to end of CSV file

https://forums.asp.net/t/1979251.aspx?Add+new+column+in+existing+CSV+file+using+C+

    var runProg = true;

    var filePath = @"C:\csharp\CSVFile.csv";

    List<Contact> contacts = new List<Contact>(); 

    var csv = File.ReadAllLines(filePath).ToList();

    File.WriteAllLines(filePath, csv);

    while (runProg)
    {
        foreach (var line in csv) 
        {
            var entries = line.Split(',');

            Contact newContact = new Contact();

            newContact.FirstName = entries[0];
            newContact.LastName = entries[1];
            newContact.EmailAddress = entries[2];

            if (entries.Length != (3))
            {
                throw new Exception("Invalid number of items in list.");
            }

            contacts.Add(newContact);

        }

        Console.WriteLine("Read from CSV file.");
        foreach (var contact in contacts)
        {
            Console.WriteLine($"{contact.FirstName}-{contact.LastName}-{contact.EmailAddress}");
        }

        List<string> output = new List<string>();

        foreach (var contact in contacts)
        {
            output.Add($"{contact.FirstName}-{contact.EmailAddress}-{contact.LastName}");
        }

        Console.WriteLine("Writing to CSV file.");

        File.WriteAllLines(filePath, output);

        Console.WriteLine("All entries written...Q program?");
        var loop = Console.ReadLine();

        if (loop == "Q")
        {
            runProg = false;
        }

我需要插入代码,使我可以创建新列以将重新排序的数据写入其中。 当我尝试添加测试代码时,抛出的主要异常是System.IndexOutOfRangeException:索引超出了数组的范围。 不知道如何扩展它(如果可能的话)。

1 个答案:

答案 0 :(得分:1)

第一次读取文件时,您要用逗号“,”分割每一行,但随后您将破折号“-”用作分隔符来重写所有行。因此,下一次您尝试读入文件并再次尝试以逗号分割时,由于不存在逗号,它将仅返回长度为1(一个)的数组,然后为“ newContact”设置值的行”将给出指示的异常。

更改:

output.Add($"{contact.FirstName}-{contact.EmailAddress}-{contact.LastName}");

收件人:

output.Add($"{contact.FirstName},{contact.EmailAddress},{contact.LastName}");

但是,您已经切换了姓氏和电子邮件地址的顺序,因此在后续读取中,这些值将被填充到错误的实例字段中。

您可以通过简单地更改output.Add()行并用逗号分隔所有列来添加更多列。

最后的注释...将if (entries.Length != (3))行移至Split()调用之后,然后之前,尝试使用硬编码索引访问数组。