Импорт больших файлов с разделителями
Вот две функции, которые я использую почти во всех моих проектах.
Пользоваться ею очень просто, например:
var
s: string;
f: TextFile;
AssignFile(f, 'D:\INPUT.TXT');
Reset(f);
while not EOF(f) do
begin
ReadLn(s, f);
ShowMessage(GetField(s, 1)); {Первое поле}
ShowMessage(GetField(s, 6)); {Шестое поле}
ShowMessage(GetField(s, 25)); {возвратит '', если нет 25 колонки...}
end;
CloseFile(f);
{ ==== Данная функция возвращает поле из строки с разделителем. ==== }
function GetField(InpString: string; fieldpos: Integer): string;
var
c: Char;
curpos, i: Integer;
begin
curpos := 1;
for i := 1 to fieldpos do
begin
result := '';
if curpos > Length(InpString) then
Break;
repeat
c := InpString[curpos];
Inc(curpos, 1);
if (c = '"') or (c = #13) or (c = #10) then
c := ' ';
if c <> ',' then
result := result + c;
until (c = ',') or (curpos > Length(InpString))
end;
if (curpos > Length(InpString)) and (i < fieldpos) then
result := '';
result := Trim(result);
end;
{ ==== Данная функция удаляет у строки левые и правые пробелы. ==== }
function Trim(inp_str: string): string;
var
i: Integer;
begin
for i := 1 to Length(inp_str) do
if inp_str[i] <> ' ' then
Break;
if i > 1 then
Delete(inp_str, 1, i - 1);
for i := Length(inp_str) downto 1 do
if inp_str[i] <> ' ' then
Break;
if i < Length(inp_str) then
Delete(inp_str, i + 1, Length(inp_str));
result := inp_str;
if result = ' ' then
result := '';
end;
|
|