![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
строка с разделителями [D7, WinXP]
heady © (2004-11-12 19:30:00)Hi, All! Скажите, кто-нибудь работал с *.csv файлами? не подскажите какой модуль? очень нужна функция, заменяющая колонку (слово) к примеру есть строка 123;456;789;012; нужно заменить 789 (третье поле) на другую строку... function ReplacePodstroku(MyString:string; PodStringNumber:byte; NewStr:string):string; что ни напишу-корявое :( может вы подскажите короткий путь? Зарание благодарен.
Palladin (2004-11-13 14:08:00) [1]:)) без тебя в Delphi написано очень и очень много... хорошо все таки у них без тебя получилось... :)
Учти что CSV могут содержать и ограничитель текста, обычно " , но не обязательно. В случае отличного от " существует еще свойство TStringList.QuoteChar
heady (2004-11-13 14:05:00) [2]Гаврила - Огромное спасибо! если честно - я просто не понял твоего первого совета, потому как переучиваюсь с TP7, и как-то плохо представляю, что же без меня уже в самом Dephi понаписано :)
begin...end - Еще раз спасибо, за предельное разжевывание для полного чайника! :)
Удачи вам!
begin...end (2004-11-13 09:31:00) [3]begin...end © (13.11.04 9:05) [8]
Блин, да что ж это со мной такое! Пример привёл какой-то левый...
Совсем отупел уже... :-(
begin
with TStringList.Create do
try
Delimiter := ';';
DelimitedText := '123.648;6545.987987;1278.4';
Strings[2] := '0000';
ShowMessage(DelimitedText);
finally
Free
end
end.
begin...end (2004-11-13 09:05:00) [4]> Гаврила © (13.11.04 0:03) [7]
Я просто почему-то не увидел Ваш пост [1], а сам как-то не додумался.
Конечно же, вне всяких сомнений, Ваше решение намного лучше и проще.
Мои извинения.
> heady
Лучше воспользоваться советом [1].
Пример:
var
I: Integer;
begin
with TStringList.Create do
try
Delimiter := ';';
DelimitedText := '123.648;6545.987987;1278.4';
for I := 0 to Count - 1 do
ShowMessage(Strings[I])
finally
Free
end
end.
Извиняюсь, что повёл по неверному пути изобретения велосипеда.
Гаврила (2004-11-13 00:03:00) [5]Странно
почему меня уже в двух ветках совершенно не слушают
неужели фигню говорю?
Мне казалось, что предлагаю оптимальные варианты решения задачи...
совсем из ума выжил наверно
heady (2004-11-12 20:51:00) [6]Спасибо еще раз! идею понял, но походу действительно не работает в случае, если искомая подстрока последняя... проще дописать GetDelimiterIndex так чтобы она скажем еще меняла глобальную переменную FieldLength, помещая в нее длину поля для замены... пишу :)
begin...end (2004-11-12 20:41:00) [7]begin...end © (12.11.04 20:38) [4]
> Например, можно GetDelimiterIndex вызвать для
> FieldNumber + 1
Т.е. для FieldNumber... Для поля, следующего за искомым... Ну, в общем, ты понял... :-)
begin...end (2004-11-12 20:38:00) [8]heady (12.11.04 20:30) [3]
> Как я понял GetDelimiterIndex возвращает номер
> позиции, с которой начинается искомая подстрока?
Она возвращает номер позиции ";" перед искомой подстрокой.
> можешь столь же красиво написать function
> GetDelimiterLastCharIndex(Str: String; Num:
> Byte):Integer; которая возвращала бы послений символ
> искомой по номеру подстроки?
А ты сам подумай... Например, можно GetDelimiterIndex вызвать для FieldNumber + 1, и отнять от результата единицу. Правда, это не будет работать, если искомое поле - последнее... Но тут тоже можно подумать... :-)
heady (2004-11-12 20:30:00) [9]Спасибо!!!
Как я понял GetDelimiterIndex возвращает номер позиции, с которой начинается искомая подстрока?
К сожалению размер всех подстрок разный 123.648;6545.987987;1278.4 и т.д. можешь столь же красиво написать function GetDelimiterLastCharIndex(Str: String; Num: Byte):Integer; которая возвращала бы послений символ искомой по номеру подстроки?
begin...end (2004-11-12 20:07:00) [10]heady (12.11.04 19:30)
А размер полей фиксирован, одинаков? Если да, то, может быть, вот это подойдёт...
Написал на вскидку, не проверял...
function ReplacePodstroku(MyStr: String; FieldNumber: Byte; NewStr: String; FieldSize: Integer): String;
function GetDelimiterIndex(Str: String; Num: Byte): Integer;
var
N: Integer;
begin
Result := 0;
N := 0;
while (N < Num) and (Result <= Length(Str)) do
begin
Inc(Result);
if Str[Result] = ';' then
Inc(N)
end
end;
var
N: Integer;
begin
N := GetDelimiterIndex(MyStr, FieldNumber - 1) + 1;
Delete(MyStr, N, FieldSize);
Insert(NewStr, MyStr, N);
Result := MyStr
end.
Гаврила (2004-11-12 19:43:00) [11]Для замены заранее известной подстроки на другую см. StringReplace
для обработки текста с разделителями хорошо подходит TStringList
см. его свойства Delimiter, DelimitedText