Текущий архив: 2004.11.28;
Скачать: CL | DM;
Внизстрока с разделителями Найти похожие ветки
← →
heady (2004-11-12 19:30) [0]Hi, All! Скажите, кто-нибудь работал с *.csv файлами? не подскажите какой модуль? очень нужна функция, заменяющая колонку (слово) к примеру есть строка 123;456;789;012; нужно заменить 789 (третье поле) на другую строку... function ReplacePodstroku(MyString:string; PodStringNumber:byte; NewStr:string):string; что ни напишу-корявое :( может вы подскажите короткий путь? Зарание благодарен.
← →
Гаврила © (2004-11-12 19:43) [1]Для замены заранее известной подстроки на другую см. StringReplace
для обработки текста с разделителями хорошо подходит TStringList
см. его свойства Delimiter, DelimitedText
← →
begin...end © (2004-11-12 20:07) [2]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.
← →
heady (2004-11-12 20:30) [3]Спасибо!!!
Как я понял GetDelimiterIndex возвращает номер позиции, с которой начинается искомая подстрока?
К сожалению размер всех подстрок разный 123.648;6545.987987;1278.4 и т.д. можешь столь же красиво написать function GetDelimiterLastCharIndex(Str: String; Num: Byte):Integer; которая возвращала бы послений символ искомой по номеру подстроки?
← →
begin...end © (2004-11-12 20:38) [4]heady (12.11.04 20:30) [3]
> Как я понял GetDelimiterIndex возвращает номер
> позиции, с которой начинается искомая подстрока?
Она возвращает номер позиции ";" перед искомой подстрокой.
> можешь столь же красиво написать function
> GetDelimiterLastCharIndex(Str: String; Num:
> Byte):Integer; которая возвращала бы послений символ
> искомой по номеру подстроки?
А ты сам подумай... Например, можно GetDelimiterIndex вызвать для FieldNumber + 1, и отнять от результата единицу. Правда, это не будет работать, если искомое поле - последнее... Но тут тоже можно подумать... :-)
← →
begin...end © (2004-11-12 20:41) [5]begin...end © (12.11.04 20:38) [4]
> Например, можно GetDelimiterIndex вызвать для
> FieldNumber + 1
Т.е. для FieldNumber... Для поля, следующего за искомым... Ну, в общем, ты понял... :-)
← →
heady (2004-11-12 20:51) [6]Спасибо еще раз! идею понял, но походу действительно не работает в случае, если искомая подстрока последняя... проще дописать GetDelimiterIndex так чтобы она скажем еще меняла глобальную переменную FieldLength, помещая в нее длину поля для замены... пишу :)
← →
Гаврила © (2004-11-13 00:03) [7]Странно
почему меня уже в двух ветках совершенно не слушают
неужели фигню говорю?
Мне казалось, что предлагаю оптимальные варианты решения задачи...
совсем из ума выжил наверно
← →
begin...end © (2004-11-13 09:05) [8]> Гаврила © (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.
Извиняюсь, что повёл по неверному пути изобретения велосипеда.
← →
begin...end © (2004-11-13 09:31) [9]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.
← →
heady (2004-11-13 14:05) [10]Гаврила - Огромное спасибо! если честно - я просто не понял твоего первого совета, потому как переучиваюсь с TP7, и как-то плохо представляю, что же без меня уже в самом Dephi понаписано :)
begin...end - Еще раз спасибо, за предельное разжевывание для полного чайника! :)
Удачи вам!
← →
Palladin © (2004-11-13 14:08) [11]:)) без тебя в Delphi написано очень и очень много... хорошо все таки у них без тебя получилось... :)
Учти что CSV могут содержать и ограничитель текста, обычно " , но не обязательно. В случае отличного от " существует еще свойство TStringList.QuoteChar
Страницы: 1 вся ветка
Текущий архив: 2004.11.28;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.037 c