Разбор текстового файла в CSV C # - PullRequest
1 голос
/ 14 сентября 2011

Я новичок в разработке на C #.Мне нужно проанализировать огромный текстовый файл, содержащий несколько строк данных на строку.Выводом будет файл CSV.

Формат файла соответствует следующему шаблону:

Acronym: TIFFE 
Name of proposal: Thermal Systems Integration for Fuel Economy
Contract number: 233826
Instrument: CP – FP
#
Acronym: STREAMLINE
Name of proposal: Strategic Research For Innovative Marine Propulsion Concepts
Contract number: 233896
Instrument: CP – FP

, где # обозначает новую запись.Теперь в этом текстовом файле сотни записей.Я хочу иметь возможность анализировать все в CSV со столбцами для Acronym, Name of Proposal и т. Д. И строк, содержащих фактические данные для каждой записи.

Есть ли лучший способ, как это сделать?

Я предполагаю, что мне нужно проанализировать данные в посреднике - например, в DataTable, - прежде чем анализировать их в CSV.

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Этот простой оператор LINQ анализирует ваш входной файл в последовательность записей и записывает каждую запись в формате CSV в выходной файл (при условии, что количество и порядок полей в каждой записи одинаков):

File.WriteAllLines("output.csv", File
    .ReadLines("input.txt")
    .GroupDelimited(line => line == "#")
    .Select(g => string.Join(",", g
        .Select(line => string.Join(line
            .Substring(line.IndexOf(": ") + 1)
            .Trim()
            .Replace("\"", "\"\""), "\"", "\"")))));

Вывод:

"TIFFE","Thermal Systems Integration for Fuel Economy","233826","CP – FP"
"STREAMLINE","Strategic Research For Innovative Marine Propulsion Concepts","233896","CP – FP"

Вспомогательный метод:

static IEnumerable<IEnumerable<T>> GroupDelimited<T>(
    this IEnumerable<T> source, Func<T, bool> delimiter)
{
    var g = new List<T>();
    foreach (var x in source)
    {
        if (delimiter(x))
        {
            yield return g;
            g = new List<T>();
        }
        else
        {
            g.Add(x);
        }
    }
    yield return g;
}
1 голос
/ 14 сентября 2011

Вам не нужно сначала разбирать это в DataTable.Вы могли бы сразу выводить StreamWrite из CSV, когда читаете исходный файл. Очевидно, это проще, если последовательность и наличие полей в каждой записи источника согласованы.

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

0 голосов
/ 14 сентября 2011

Вы можете использовать Linq to Text files и разделить строку на ":" , чтобы получить два разных столбца.

Вот лучшее объяснение: http://schotime.net/blog/index.php/2008/03/18/importing-data-files-with-linq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...