Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 28.07.2008, 13:52
MSD MSD вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 35
Репутация: 10
По умолчанию

Нет вот смотри, есть фойлик C:\1.txt который содержит (текст примерный):
Иван Петров
Вася Гулькин
Иван Денисов
Саша Пупкин


я хочу чтобы в этом же файлике после обработки осталось только
Иван;
Вася;
Иван;
Саша;
просто т.е. остались первые слова и добавились точки с запятой в конце... Изначально еще просто строки в файле могут начанаться с пробелов, а я так понимаю что это еще одна сложность..
Ответить с цитированием
  #17  
Старый 28.07.2008, 14:43
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию

Я конечно не могу так изящно как The Shadow, но вот это у меня только что сработало без проблем:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
txtFile : TStrings;
i : integer;
str : string;
begin
  txtFile := TStringList.create; // создаем объект
  txtFile.LoadFromFile(ExtractFilePath(Application.ExeName)+'1.txt'); // читаем файл из папки с прогой
    for i := 0 to txtFile.Count - 1 do begin
      str := TrimLeft(txtFile.Strings [i]); // сразу убераем пробелы в начале
      str := copy(str,0,pos(' ',(str))-1)+ ';'; // копируем с начала до первого пробела и прибавляем в конце ';'
      txtFile.Strings[i] := str; // заменяем эту строку созданной
    end;
    txtFile.SaveToFile(ExtractFilePath(Application.ExeName)+'2.txt'); // сохраняем в файл
    txtFile.Free; // освобождаем память
end;

Считало из одного файла (пробелы добавил специально)
Код:
  Иван Петров
 Вася Гулькин
      Иван Денисов
Саша Пупкин
и во втором получилось вот это:
Код:
Иван;
Вася;
Иван;
Саша;
Если запускать процедуру повторно на одном и том же файле, то во втором случае получим одни точки с запятой в начале... Можно в начале добавить проверку на наличие тех же пробелов и точек с запятой (если нет пробелов и точка с запятой последний символ в строке, то стока уже была обработана). Тут уже сам смотри что тебе нужно.
Ответить с цитированием
  #18  
Старый 28.07.2008, 15:19
MSD MSD вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 35
Репутация: 10
По умолчанию

Вылетает с ошибкой:
Project.exe raised exception class EFOpenError with message 'Cannot open file C:\Program Files\Borland\delphi6\Projects\C:\Statistic\1.xxx. txt'. Process stoped...... Все имена и пути проверил все сходиться. Что может быть?
Ответить с цитированием
  #19  
Старый 28.07.2008, 15:20
MSD MSD вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 35
Репутация: 10
По умолчанию

Кстати спасибо что помогаешь....
Ответить с цитированием
  #20  
Старый 28.07.2008, 15:28
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию

Дык ты не ставь путь. У тебя похоже забито так:
txtFile.LoadFromFile(ExtractFilePath(Application.E xeName)+'C:\Statistic\1.xxx. txt');
Сделай так:
txtFile.LoadFromFile(ExtractFilePath(Application.E xeName)+'\Statistic\1.xxx.txt');
Либо если у тебя где-то конкретно хранится, то так:
txtFile.LoadFromFile('C:\Statistic\1.xxx.txt');
Ответить с цитированием
  #21  
Старый 28.07.2008, 15:32
MSD MSD вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 35
Репутация: 10
По умолчанию

Понятно....)))) Все пошло Спасибо.
Ответить с цитированием
  #22  
Старый 28.07.2008, 16:03
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию

Да пожалуйста.

Только все равно допиши проверки всякие - случаи разные бывают. Вдруг пустая строка или уже обработанная... Я если что-то пишу обычно стараюсь обработать даже самые нелепые ситуации чтобы потом проблем было меньше.
Ответить с цитированием
  #23  
Старый 28.07.2008, 16:37
MSD MSD вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 35
Репутация: 10
По умолчанию

Слушай а если строка состоит из одного слова, то остается только ";" блин еще одна проблемка, не подскажешь как быть?
Ответить с цитированием
  #24  
Старый 28.07.2008, 17:04
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию

Все есть в комментариях. Вкратце: проверяем пробел есть или нет (если нет то одно слово). Если нет пробела то смотрим ставили ли точку с запятой или нет (ставим если ее нет) и заодно проверяет на пустую строку - ничего с ней не делает и переходит к следующей.
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
txtFile : TStrings;
i : integer;
str : string;
begin
  txtFile := TStringList.create; // создаем объект
  txtFile.LoadFromFile(ExtractFilePath(Application.ExeName)+'1.txt'); // читаем файл из папки с прогой
    for i := 0 to txtFile.Count - 1 do begin
      str := TrimLeft(txtFile.Strings [i]); // сразу убераем пробелы в начале
      if Length(str)>0 then begin // проверка на пустую строку
        if pos(' ',str) > 0 then begin // ищем пробел
          str := copy(str,0,pos(' ',(str))-1)+ ';'; // копируем с начала до первого пробела и прибавляем в конце ';'
        end else begin // пробела нет
          if pos(';',str) = 0 then begin // обрабатывали или нет
            str := str + ';';
          end;
        end;
      end;
    txtFile.Strings[i] := str; // заменяем эту строку созданной
    end;
  txtFile.SaveToFile(ExtractFilePath(Application.ExeName)+'2.txt'); // сохраняем в файл
  txtFile.Free; // освобождаем память

end;

Код:
Обрабатывал такой пример:

  Иван Петров

 Вася Гулькин
      Иван Денисов

петя;
Саша Пупкин

коля

Получил во втором файле:
Иван;

Вася;
Иван;

петя;
Саша;

коля;
Ответить с цитированием
  #25  
Старый 28.07.2008, 18:09
MSD MSD вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 35
Репутация: 10
По умолчанию

И еще подскажите пожалуйста как во всех текстовых файлах находящихся в папке удалить первую строчку... Название файлов может быть разное. Спасибо.
Ответить с цитированием
  #26  
Старый 28.07.2008, 18:31
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  SR: TSearchRec;
begin
  if FindFirst('Папка\*.txt', faAnyFile, SR) = 0 then
  repeat
    with TStringList.Create do
    begin
      LoadFromFile('Папка\' + SR.Name);
      if Count > 1 then
      Delete(0);
      SaveToFile('Папка\' + SR.Name);
      Free;
    end;
  until FindNext(SR) <> 0;
  FindClose(SR);
end;
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #27  
Старый 28.07.2008, 18:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Поиск по маске, а дальше все зависит от того, что ты понимаешь под первой строчкой.

Код:
procedure TForm1.Delete1stLine(APath : String); // APath - стартовый путь
var
  iFound : Integer;
  F : TSearhcRec;
  List : TStringList;
begin
  APAth := IncludeTrailingPathDelimiter(APath); // на всякий случай
  iFound := FindFirst(IncludeTrailingPathDelimiter(APath) + '*.*',faAnyFile,F);
  While iFound = 0 Do
    Begin
       If (F.Attr And faDirectory) <> 0
         Then
           Begin
             // Папка
             If (F.Name <> '.') And (F.Name <> '..') 
               Then Delete1stLine(APath + F.Name); // Если по подпапка ненадо, то не вызывать
           End
         Else
           Begin
              // Файл
              If MatchesMask(F.Name,'*.txt') Then // здесь указать маску файла
                Begin
                  List := TStringList.Create;
                  List.LoadFromFile(APath + F.Name);
                  List.Delete(0);
                  List.SaveTofile(APath + F.Name);
                  List.Free;
                End;
           Endl
    End;
end;

Удаляет первую физическую строку из файлов *.txt с проходом по подкаталогам.
Ответить с цитированием
  #28  
Старый 28.07.2008, 18:43
MSD MSD вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 35
Репутация: 10
По умолчанию

Спасибо. Блин ну и мозги у вас ребята... ))
Ответить с цитированием
  #29  
Старый 28.07.2008, 18:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, вопрос по перебору файлов надо, наверное, уже куда-нить вынести и прибить гвоздями. а за его повторное задавание лупить из плюсомета. На моей памяти он поднимается уже раз 4 или 5ый в разных вариациях.
Ответить с цитированием
  #30  
Старый 01.08.2008, 08:52
MSD MSD вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 35
Репутация: 10
Печаль Help....

Здравствуйте. Опять нужна ваша помощь. Хочу разобраться как сделать.
Есть текстовый файлик Билет.txt, со строгой структурой следующего содержания:
Билет,Номер рейса,525545545,цена билета,4525.50,+0000000001,Чек №12,11:21:44,всего уплачено: 4525.50, 0.00,
Билет,Номер рейса,525548585,цена билета,4000.50,+0000000001,Чек №12,11:21:44,всего уплачено: 4000.50, 0.00,
Билет,Номер рейса,562214,цена билета,2000.50,+0000000001,Чек №15,11:21:44,всего уплачено: 2000.50, 0.00,
Билет,Номер рейса,562564,цена билета,3000.50,+0000000001,Чек №18,11:21:44,всего уплачено: 3000.50, 0.00,
Билет,Номер рейса,562564,цена билета,3000.50,+0000000001,Чек №19,11:21:44,всего уплачено: 3000.50, 0.00,

А результатом хочу чтобы получилось следующее в одном файле допустим "Номер рейса.txt":
12 // номер чека
525545545, //номера рейса
525548585,
15 //номер чека
562214, //номера рейса
18 //номер чека
562564, //номера рейса
19, //номер чека
562564, //номера рейса
Если в одном чеке два рейса как в строке 1 и 2 файла Билет.txt
тогда номерчека чтобы не повторялся а посто
писались номера рейса для этого чека.

И в другом файле чтобы получилось следующее в одном файле допустим "Стоимость рейса.txt":
12 // номер чека
4525.50 //всего получено
4000.50
15 //номер чека
2000.50 //всего получено
18 //номер чека
3000.50 //всего получено
19, //номер чека
3000.50 //всего получено
Помогите пожалуйста. Спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter