Главная страница
    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.47 MB
Время: 0.037 c
1-1100392675
Maxim____
2004-11-14 03:37
2004.11.28
tcustomTrackbar


1-1100667952
Maxim2030
2004-11-17 08:05
2004.11.28
стандарты кодирования на Delphi


14-1099877440
KilkennyCat
2004-11-08 04:30
2004.11.28
громадный орех в соседнем форуме.


8-1093770518
DimOn2
2004-08-29 13:08
2004.11.28
Avi


10-1066726234
zxc
2003-10-21 12:50
2004.11.28
возможно ли работа DCOM через Интернет??





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский