Эффективный способ чтения из текстового файла в таблицу базы данных - PullRequest
2 голосов
/ 21 января 2012

У меня есть файл журнала.Файл структурирован.Каждая строка разделена запятыми, чтобы она выглядела как таблица.Я должен прочитать из этого файла и перенести содержимое в таблицу базы данных.Я хочу трактовать первые 9 запятых как разделители, а остальные только как содержимое десятого столбца.Таким образом, в строке может быть более 9 запятых, но десятая и последующие не должны восприниматься как разделитель.Я действительно знаю, как это сделать, перебирая символы и проверяя наличие запятых.Но я не хочу, чтобы это было неэффективно.может есть лучший способ?Каков был бы самый точный способ сделать это?Либо C #, либо Delphi в порядке.Для Oracle я, вероятно, буду использовать Oracle, но SQL Server также является опцией.

Ответы [ 3 ]

4 голосов
/ 21 января 2012

Перегрузка методом String.Split(char[],int) позволяет достичь того, что вам нужно. Например:

string line = "a,b,c,d,e,f,g,h,i,j,k,l,m,n";
string[] fields = line.Split(new char[] { ',' }, 10);

Массив fields будет содержать десять элементов. Первые девять элементов соответствуют первым девяти подстрокам line, которые были разделены ',' символами, тогда как последний элемент будет соответствовать оставшейся подстроке (после девятого ',' вхождения).

Из MSDN (второй аргумент, передаваемый методу Split(char[], int) - count):

Если в этом экземпляре больше чем count подстрок, первые count минус 1 подстрока возвращаются в первых count минус 1 элементе возвращаемого значения, а остальные символы в этом экземпляре возвращаются в последний элемент возвращаемого значения.

Таким образом, выполняя:

for (int i = 0; i < fields.Length; ++i)
    Console.WriteLine(string.Format("fields[{0}]: \"{1}\"", i, fields[i]));

будет выводить:

fields[0]: "a"
fields[1]: "b"
fields[2]: "c"
fields[3]: "d"
fields[4]: "e"
fields[5]: "f"
fields[6]: "g"
fields[7]: "h"
fields[8]: "i"
fields[9]: "j,k,l,m,n"
3 голосов
/ 21 января 2012

В некоторых базах данных есть средства ETL (извлечение, преобразование, загрузка), которые позволяют очень быстро и эффективно импортировать внешние данные после настройки.Насколько они гибки, зависит от базы данных - вы не сказали, какая именно.Чтобы идентифицировать ваши столбцы в Delphi, я бы использовал регулярные выражения, в любом случае они делают именно то, что вы делаете - перебираете строки и сопоставляете символы, просто хорошая библиотека регулярных выражений может быть быстрой (и гибкой).Чего следует избегать, так это читать по одному символу на чтение файла.Прочитайте n строк в буфер памяти и обработайте их там.

1 голос
/ 25 января 2012

Попробуйте использовать FileHelpers Library и ее класс DatabaseStorage.

...