Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.046 c
3-1099023202
sanek
2004-10-29 08:13
2004.11.28
как сложить цифровые данный из разных ячеяк таблици


3-1097162482
sirsergio
2004-10-07 19:21
2004.11.28
Как остановить выполнение запроса программно


4-1097680188
Comp
2004-10-13 19:09
2004.11.28
DrawFocusRect на стандартной кнопке.


14-1100111512
zokzok
2004-11-10 21:31
2004.11.28
Абстрактные методы


14-1100329029
gn
2004-11-13 09:57
2004.11.28
Банки борются с кардингом с помощью SMS