C # Почему я получаю только частичные результаты при разборе файла CSV или TSV? - PullRequest
0 голосов
/ 03 августа 2011

Я пытаюсь получить второе значение из файла CSV с 100 строками. Я получаю первые 42 значения, затем он останавливается ... нет сообщений об ошибках или обработки ошибок вообще. Я озадачен и на временной шкале. Он также делает это для файла TSV, но дает первые 43 результата. Пожалуйста, помогите и дайте мне знать, если это выглядит странно для вас.

Я использую Streamreader, читая каждую строку в массив строк, разбивая массив и принимая второе значение и добавляя его в список ...

        string path = @"C:\Users\dave\Desktop\codes\testfile.txt";
        StreamReader sr = new StreamReader(path);
        List<string> stkno = new List<string>();

        foreach (var line in path)
        {
            string s = sr.ReadLine();
            string[] words = s.Split(',');
            stkno.Add(words[1]);
        }
        var message = string.Join(",", stkno.ToArray());
        MessageBox.Show(message);

Ответы [ 4 ]

3 голосов
/ 03 августа 2011

Вы случайно перебираете количество символов в пути к файлу, а не количество строк в строке.Это изменение должно исправить это:

    string path = @"C:\Users\dave\Desktop\codes\testfile.txt";
    StreamReader sr = new StreamReader(path);
    List<string> stkno = new List<string>();

    while (sr.Peek() >= 0) 
    {
        string s = sr.ReadLine();
        string[] words = s.Split(',');
        stkno.Add(words[1]);
    }
    var message = string.Join(",", stkno.ToArray());
    MessageBox.Show(message);
3 голосов
/ 03 августа 2011

Ваша переменная path является строкой.Это означает, что когда вы foreach превышаете его, вы получаете последовательность из символов - 'C' затем ':' затем '\' и т. Д. Я не думаю, что это то, что вы хотите сделать...

Вот более простой подход с использованием File.ReadLines:

string path = @"C:\Users\dave\Desktop\codes\testfile.txt";

List<string> stkno = (from line in File.ReadLines(path)
                      let words = line.Split(',')
                      select words[1]).ToList();

Или:

string path = @"C:\Users\dave\Desktop\codes\testfile.txt";

List<string> stkno = File.ReadLines(path)
                         .Select(line => line.Split(',')[1])
                         .ToList();

Если вы используете .NET3.5, и вы не против прочитать весь файл за один раз, вместо этого вы можете использовать File.ReadAllLines.

0 голосов
/ 03 августа 2011

Я думаю, что вы хотите сделать:

    string path = @"C:\Users\dave\Desktop\codes\testfile.txt";
    StreamReader sr = new StreamReader(path);
    List<string> stkno = new List<string>();

    string s;
    while(s = sr.ReadLine() != null)
    {
        string[] words = s.Split(',');
        stkno.Add(words[1]);
    }
    var message = string.Join(",", stkno.ToArray());
    MessageBox.Show(message);
0 голосов
/ 03 августа 2011

Как насчет этого:

    string path = @"C:\Users\dave\Desktop\codes\testfile.txt";
    var secondWords = from line in File.ReadAllLines(path)
                        let words = line.Split(',')
                        select words[1];

    var message = string.Join(",", secondWords.ToArray());
...