Вопрос

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?

Это было полезно?

Решение

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();

Другие советы

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;

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top