2013-07-18 5 views
1

Мне нужно прочитать несколько файлов csv и объединить их. Объединенные данные используются для создания диаграммы (с помощью элемента управления диаграммой .NET).Чтение csv logfiles с разными заголовками/столбцами

До сих пор я сделал это с помощью простого StreamReader и добавил все к одному DataTable:

while (sr.Peek() > -1) 
{ 
    strLine = sr.ReadLine(); 
    strLine = strLine.TrimEnd(';'); 
    strArray = strLine.Split(delimiter); 
    dataTableMergedData.Rows.Add(strArray); 
} 

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

Моя текущая процедура не работает сейчас, и я прошу совета, как это сделать. Производительность важна из-за того, что каждый файл журнала содержит около 1500 строк и до 100 столбцов, а лог-файлы объединяются до одногодичного периода (равно 365 файлам).

Я бы сделал так: создание DataTable, которое должно содержать все данные в конце и чтение каждого файла журнала в отдельный DataTable. После каждой операции чтения я добавляю отдельный DataTable в «большой» DataTable, проверяю, были ли столбцы изменены и добавили новые столбцы, если они это сделали.

Но я боюсь, что использование DataTables повлияет на производительность.

Примечание: Я делаю это с winforms, но я думаю, что это не имеет значения.

Редактировать: Пробовал CsvReader, но это примерно в 4 раза медленнее, чем мое текущее решение.

ответ

1

После нескольких часов тестирования я сделал это так, как я описал его в вопрос:

Во-первых, я создал DataTable, который должен содержать все данные в конце. Затем я просматриваю все лог-файлы с помощью цикла foreach-loop, и для каждого файла журнала я создаю еще DataTable и заполняю его csv-данными из файла журнала. Эта таблица добавляется к первому DataTable, и независимо от того, имеют ли они разные столбцы, они добавляются должным образом.

Это может стоить немного производительности по сравнению с простым StreamReader, но его легче расширить и ускорить, чем LumenWorks CsvReader.