Member 12285600 Ответов: 3

Разбиение CSV-файла на заголовки.


Здравствуйте, я пытаюсь разделить CSV по источнику данных, но сохраняю заголовки. Оригинального кода мне было -


var splitQuery = from line in File.ReadLines(@"C:\test\test1.csv")
            let source = line.Split(',').Last()
            group line by source into outputs
            select outputs;

foreach (var output in splitQuery)
{
    File.WriteAllLines(@"C:\test\" + output.Key + ".csv", output);
}



Это сработало, однако он не включал заголовки в разделенные файлы, поэтому я попробовал это сделать -

var headerLine = File.ReadLines(@"C:\test\test1.csv");
            var nHeaderLine = headerLine.Take(1);

            string FHeader = nHeaderLine.ToString();


            var splitQuery = from line in headerLine
                             let source = line.Split(',').Last()
                             group line by source into outputs
                             select outputs;

            foreach (var output in splitQuery)
            {
                var Foutput = FHeader + "\r\n" + output;

                File.WriteAllLines(@"C:\test\" + output.Key + ".csv", Foutput);

            }



Я, вероятно, делаю это совершенно неправильно, но я получаю две ошибки (до сих пор), и это


File.WriteAllLines(@"C:\test\" + output.Key + ".csv", Foutput);


Error	1	The best overloaded method match for 'System.IO.File.WriteAllLines(string, System.Collections.Generic.IEnumerable<string>)' has some invalid arguments	C:\Users\nicoles\Documents\Visual Studio 2013\Projects\splitTest\splitTest\Program.cs	32	17	splitTest



Error	2	Argument 2: cannot convert from 'string' to 'System.Collections.Generic.IEnumerable<string>'	C:\Users\nicoles\Documents\Visual Studio 2013\Projects\splitTest\splitTest\Program.cs	32	71	splitTest



Не мог бы кто-нибудь помочь мне, пожалуйста

Что я уже пробовал:

var headerLine = File.ReadLines(@"C:\test\test1.csv");
            var nHeaderLine = headerLine.Take(1);

            string FHeader = nHeaderLine.ToString();


            var splitQuery = from line in headerLine
                             let source = line.Split(',').Last()
                             group line by source into outputs
                             select outputs;

            foreach (var output in splitQuery)
            {
                var Foutput = FHeader + "\r\n" + output;

                File.WriteAllLines(@"C:\test\" + output.Key + ".csv", Foutput);

            }

3 Ответов

Рейтинг:
2

Richard MacCutchan

Видеть Файл.Метод WriteAllLines (System.IO)[^]; у него нет перегрузки, которая занимает две строки. И действительно ли вы хотите написать строку заголовка перед каждой строкой текста в вашем выводе? Попробуйте использовать правильные типы переменных, а не использовать var везде, и, наверное, легче увидеть, что не так.


Рейтинг:
0

#realJSOP

Недавно я опубликовал статью о разборе CSV-файлов. Он поддерживает имена столбцов в отдельном списке, называемом "столбцы". Класс довольно легкий, и вы можете унаследовать его и переопределить почти всю функциональность, чтобы делать то, что вам нужно.

Парсер CSV файлов[^]

Он не записывает файлы, потому что его основная цель-просто читать CSV-файлы и разделять поля на соответствующие части. Однако в вашем производном классе вы можете определенно добавить эту функциональность.


Maciej Los

5ед!

Рейтинг:
0

Ehsan Sajjad

WriteAllLines вам нужна коллекция строк в качестве входных данных, поэтому вам нужно создать коллекцию строк, которая содержит все строки, которые должны быть сохранены в файле, а затем, наконец, вызвать метод WriteAllLines, написать его только один раз, как:

var lines=  splitQuery.Select(output=> FHeader + "\r\n" + output)
File.WriteAllLines(@"C:\test\" + output.Key + ".csv", lines);           


или еще лучше можно избежать дополнительного запроса linq, выполнив :

var lines = from line in headerLine
            let source = line.Split(',').Last()
            group line by source into outputs
            select FHeader + "\r\n" + outputs;

File.WriteAllLines(@"C:\test\" + output.Key + ".csv", lines);