How do I separate each line of a .csv file into a string list>

跟風遠走 提交于 2020-01-05 01:10:33

问题


I am new to c# and am attempting to read in a .csv file and put each line of text in to a separate list item so I can sort it later.

the .csv file is organised like so:

1;"final60";"United Kingdom";"2013-12-06 15:48:16";
2;"donnyr8";"Netherlands";"2013-12-06 15:54:32"; etc

This is my first attempt that doesn't work.It shows no errors in Visual studios 2010 but when I run the console program it displays the following Exception instead of the list. Exception of type 'System.OutOFMemoryException' was thrown. Which is bizarre because the .csv file only contains a small list.

try
{
// load csv file
using (StreamReader file = new StreamReader("file.csv"))
      {
       string line = file.ReadLine();
       List<string> fileList = new List<string>();
       // Do something with the lines from the file until the end of  
       // the file is reached. 
       while (line != null)
       {

          fileList.Add(line);

        }
        foreach (string fileListLine in fileList)
         {
            Console.WriteLine(fileListLine);
         }
       }
}
catch (Exception e)
{
  // Let the user know what went wrong.
   Console.WriteLine("The file could not be read:");
   Console.WriteLine(e.Message);
}

So am I approaching this the correct way?


回答1:


If the file you are loading isn't really big then you can use File.ReadAllLines:

List<string> list = File.ReadAllLines("file.csv").ToList();

As Servy pointed out in comment it would be better to use File.ReadLines method.

File.ReadLines - MSDN

The ReadLines and ReadAllLines methods differ as follows: When you use ReadLines, you can start enumerating the collection of strings before the whole collection is returned; when you use ReadAllLines, you must wait for the whole array of strings be returned before you can access the array. Therefore, when you are working with very large files, ReadLines can be more efficient.

If you need a List<string> then you can do:

List<string> list = File.ReadLines("file.csv").ToList();



回答2:


You are not updating the line variable so the line will be always different from null infinite loop which cause OutOfMemoryException

 try
    {
    // load csv file
    using (StreamReader file = new StreamReader("file.csv"))
          {
           string line = file.ReadLine();
           List<string> fileList = new List<string>();
           // Do something with the lines from the file until the end of  
           // the file is reached. 
           while (line != null)
           {

              fileList.Add(line);
               line = file.ReadLine();

            }
            foreach (string fileListLine in fileList)
             {
                Console.WriteLine(fileListLine);
             }
           }
    }

but the correct approaches will be

List<string> list = File.ReadLines("file.csv").ToList();

which is better than File.ReadAllLines for the following reason From MSDN:

When you use ReadLines, you can start enumerating the collection of strings before the whole collection is returned;




回答3:


You should use File.ReadAllLines() and then parse the strings in the array. For extremely large files this might not be feasible and you'll have to stream the single lines in and process them one by one. But this is something you can only decide AFTER you have seen this quick approach failing miserably. Until then, stick to the quick and dirty.



来源:https://stackoverflow.com/questions/21484619/how-do-i-separate-each-line-of-a-csv-file-into-a-string-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!