Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2013, 12:37   #1
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию Как обработать txt c разделителем и убрать лишнее

Добрый день! Есть файл txt c данными такого вида:
15;432156;name1;13,30;;;;12345;;;
26;323257;name2;27,67;;56;;;56;;
Мне нужно подготовить файл для экспорта в бд, убрав все лишнее, т.е. все данные в строке после 4-го разделителя, например. Получится должно так:
15;432156;name1;13,30;
26;323257;name2;27,67;
И сохранить результат в файл txt. Можно в исходный файл, можно в новый. Спасибо!
Kerby666 вне форума Ответить с цитированием
Старый 08.08.2013, 13:33   #2
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Как вариант:
1. Загнать файл в StringList (LoadFromFile)
2. Пройтись по каждой строке функцией StringReplace (StringReplace('26;323257;name2;27, 67;;56;;;56;;',';;',';',[rfReplaceAll] ) ; )
3. Перезаписать файл из StringList (SaveToFile)
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 08.08.2013, 13:46   #3
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию

Цитата:
Сообщение от spirit-ua Посмотреть сообщение
Как вариант:
1. Загнать файл в StringList (LoadFromFile)
2. Пройтись по каждой строке функцией StringReplace (StringReplace('26;323257;name2;27, 67;;56;;;56;;',';;',';',[rfReplaceAll] ) ; )
3. Перезаписать файл из StringList (SaveToFile)
Если я правильно понял, то этим я заменю все ;; на ; А мне нужно удалить все после 4-ой точки с запятой. Это же совсем не то получается.
Я себе это представляю так:
нужно пробежать по строке, считая по пути количество разделителей, когда счетчик будет равным четырем, очистить строку с этой позиции до конца строки. Вот как это написать на delphi?

Последний раз редактировалось Kerby666; 08.08.2013 в 13:50.
Kerby666 вне форума Ответить с цитированием
Старый 08.08.2013, 14:19   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

тоже мне, "бином Ньютона"...

ловите код:
Код:
var i, psx : integer;
  s, stemp : string;
begin
  s := '15;432156;name1;13,30;;;;12345;;;';

  stemp := s;
  psx := 0;
  i := 0;
  while (Pos(';', stemp)>0) and (i<4) do begin
    psx := psx + Pos(';', stemp);
    stemp := copy(stemp, Pos(';', stemp)+1, length(stemp));
    inc(i);
    ShowMessage(IntToStr(i)+' '+IntToStr(psx)+' stemp = '+stemp);
  end;

  if (i=4) then
     s := Copy(s, 1, psx) // в s нужный нам результат
  else
     Тут ваши действия, если в строке нет нужно количества точек с запятой...

p.s. ещё эту же задачу можно решить банальным циклом по всем символам строки с подсчётом точек с запятой.
а ещё, эту же задачу можно решить через использование PosEx (я, в принципе, в своём примере моделировал именно поведение функции PosEx)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.08.2013, 15:03   #5
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
тоже мне, "бином Ньютона"...

ловите код:
Код:
var i, psx : integer;
  s, stemp : string;
begin
  s := '15;432156;name1;13,30;;;;12345;;;';

  stemp := s;
  psx := 0;
  i := 0;
  while (Pos(';', stemp)>0) and (i<4) do begin
    psx := psx + Pos(';', stemp);
    stemp := copy(stemp, Pos(';', stemp)+1, length(stemp));
    inc(i);
    ShowMessage(IntToStr(i)+' '+IntToStr(psx)+' stemp = '+stemp);
  end;

  if (i=4) then
     s := Copy(s, 1, psx) // в s нужный нам результат
  else
     Тут ваши действия, если в строке нет нужно количества точек с запятой...

p.s. ещё эту же задачу можно решить банальным циклом по всем символам строки с подсчётом точек с запятой.
а ещё, эту же задачу можно решить через использование PosEx (я, в принципе, в своём примере моделировал именно поведение функции PosEx)
Спасибо! Можете расширить свой пример, добавить открытие txt и сохранение в файл?
Kerby666 вне форума Ответить с цитированием
Старый 08.08.2013, 15:19   #6
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Kerby666 Посмотреть сообщение
Если я правильно понял, то этим я заменю все ;; на ; А мне нужно удалить все после 4-ой точки с запятой. Это же совсем не то получается.
Я себе это представляю так:
нужно пробежать по строке, считая по пути количество разделителей, когда счетчик будет равным четырем, очистить строку с этой позиции до конца строки. Вот как это написать на delphi?
Верно пинмаете...
1. Бежим по всей строке циклом (for i:=1 to Length('строка'))
2. Проверяем каждый символ на вылидность символу (if copy('строка',i,1 = ';'))
3. Увелисиваем счетчик
4. Если счетчик равен 4 сопируем нужную часть строки (copy('строка',1,i))
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 08.08.2013, 15:25   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ноу проблем.
держите
исходники проекта: TransformDataFileExample_SOURCES.rar
exe-шник: TransformDataFileExample_EXE.rar

код там такой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var ts : TStringList;
  s, stemp : string;
  i, k, psx : integer;
begin
  if not FileExists(Edit1.Text) then begin
    ShowMessage('Нет входного файла!');
    Exit
  end;
  ts := TStringList.Create;
  ts.LoadFromFile(Edit1.Text);
  for i:= 0 to ts.Count - 1 do begin
    s := trim(ts.Strings[i]);
    if (pos(';',s)>1) then begin
      stemp := s;
        psx := 0;
        k := 0;
        while (Pos(';', stemp)>0) and (k<4) do begin
          psx := psx + Pos(';', stemp);
          stemp := copy(stemp, Pos(';', stemp)+1, length(stemp));
          inc(k);
        end;

        if (k=4) then
           ts.Strings[i] := Copy(s, 1, psx) // в s нужный нам результат
    end;
  end;

  ts.SaveToFile(Edit2.Text);

  FreeAndNil(ts);

  ShowMessage('Готово! см. файл '+Edit2.Text);
end;

разумеется, открытие файла нужно делать через TOpenDialog, но мне лень и некогда. Оставляю косметические доработки на вашей совести!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.08.2013, 15:37   #8
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ноу проблем.
держите
исходники проекта: Вложение 62161
exe-шник: Вложение 62162

код там такой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var ts : TStringList;
  s, stemp : string;
  i, k, psx : integer;
begin
  if not FileExists(Edit1.Text) then begin
    ShowMessage('Нет входного файла!');
    Exit
  end;
  ts := TStringList.Create;
  ts.LoadFromFile(Edit1.Text);
  for i:= 0 to ts.Count - 1 do begin
    s := trim(ts.Strings[i]);
    if (pos(';',s)>1) then begin
      stemp := s;
        psx := 0;
        k := 0;
        while (Pos(';', stemp)>0) and (k<4) do begin
          psx := psx + Pos(';', stemp);
          stemp := copy(stemp, Pos(';', stemp)+1, length(stemp));
          inc(k);
        end;

        if (k=4) then
           ts.Strings[i] := Copy(s, 1, psx) // в s нужный нам результат
    end;
  end;

  ts.SaveToFile(Edit2.Text);

  FreeAndNil(ts);

  ShowMessage('Готово! см. файл '+Edit2.Text);
end;

разумеется, открытие файла нужно делать через TOpenDialog, но мне лень и некогда. Оставляю косметические доработки на вашей совести!
Безмерно благодарен!
Kerby666 вне форума Ответить с цитированием
Старый 09.08.2013, 23:44   #9
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

а я бы использовал PosEX было бы красии и меньше переменных использовалось...
IvaniuS вне форума Ответить с цитированием
Старый 12.08.2013, 16:08   #10
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

формат стандартного csv файла. нафига его как то обрезать? если он сделан культурно по столбцам.
вообще любая уважающая себя база данных позволяет сделать этот экспорт и импорт, потом только колонки переименовать.
или можно в ручную например с помощью exel или его аналога опен офиса. и работать потом только с нужными столбцами. так что либо 5 кликов в офисе либо куча проверок в дельфи.
Прежде чем чего то писать, лучше подумать 30 мин, нет ли уже готовых решений данного действия.(с) основы планирования
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать лишнее pruf PHP 24 06.09.2011 19:06
Нужно убрать лишнее!!! Less1 Помощь студентам 10 26.06.2011 19:15
ColorBox - убрать лишнее MyLastHit Общие вопросы Delphi 1 08.12.2010 08:49
Убрать лишнее Айдар Общие вопросы C/C++ 1 17.09.2010 01:08
убрать лишнее из программы dragun4ik Помощь студентам 2 30.01.2010 17:33