Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Как "склеить" строки?   Найти похожие ветки 

 
Tornado ©   (2004-04-28 11:12) [0]

есть такой текстовой файл:

                   
nov-01-vtg-diagnost-nek              
rasov                                                            
nov-01-vtg-diagnost-shi          
shko                                                              
nov-01-vtg-ivc-lukshina            
nov-01-vtg-ivc-muravyev


т.е. первые два адреса идут с переносом на следующую строку (это связано с ограниченностью длины строки в 23 символа), а остальные два убрались в одну строку. Это фрагмент списка, таких вариантов может быть много. Мне нужно как бы "склеить" те адреса которые переносятся в одну строку. Все адреса начинаются с "nov", это можно использовать как ключевое слово. Вопрос как "склеить"? Спасибо.


 
GroZ   (2004-04-28 11:19) [1]

Ну оновании данной информации невозможно сделать алгоритм корректно работающий во всех случаях, например как быть в случае:

nov-01-vtg-diagnost-nek
rasov
nov-01-vtg-diagnost-shi
nov
nov-01-vtg-ivc-lukshina
nov-01-vtg-ivc-muravyev
?
недостаточность информации


 
Sha ©   (2004-04-28 11:21) [2]

Распечатываешь, вырезаешь, склеиваешь :)
Что должно быть результатом: файл, StringList, Text или ...?


 
panov ©   (2004-04-28 11:31) [3]

Примерно так:

var
 List1,Lis2: TStringList;
 i: Integer;
begin
 List1 := TStringList.Create;
 List2 := TStringList.Create;  
 try
   List1.LoadFromFile("SrcFile.txt);
   
   for i := 0 to List1.Count-1 do
   begin
     if Pos("-",List1[i])=0
       then List2[List2.Count-1] := List2[List2.Count-1]+List1[i]
       else List2.Add(List1[i]);
   end;
   Memo1.Lines.Assign(List2);
 funally
   List1.Free;
   List2.Free;
 end;


 
GroZ   (2004-04-28 11:42) [4]

2 panov,
алгоритм не правильный, как и следовало ожидать ...


 
panov ©   (2004-04-28 11:46) [5]

>GroZ   (28.04.04 11:42) [4]
И чем же он неправильный?
Всё работат прекрасно.


 
panov ©   (2004-04-28 11:47) [6]

После прогона и исправления синтаксич. ошибок без изменения алгоритма:


procedure TForm1.Button3Click(Sender: TObject);
var
List1,List2: TStringList;
i: Integer;
begin
List1 := TStringList.Create;
List2 := TStringList.Create;
try
  List1.LoadFromFile("SrcFile.txt");
 
  for i := 0 to List1.Count-1 do
  begin
    if Pos("-",List1[i])=0
      then List2[List2.Count-1] := List2[List2.Count-1]+List1[i]
      else List2.Add(List1[i]);
  end;
  ListBox1.Items.Assign(List2);
finally
  List1.Free;
  List2.Free;
end;

end;


 
panov ©   (2004-04-28 11:48) [7]

>GroZ   (28.04.04 11:42) [4]

В следующий раз, прежде чем писать, проверь.


 
Андрей Сенченко ©   (2004-04-28 11:59) [8]

panov ©   (28.04.04 11:48)

nov-01-vtg-diagnost-nek
rasov
nov-01-vtg-diagnost-shi
nov
nov-01-vtg-specialdiagn
ost-ivanov
nov-01-vtg-ivc-muravyev


 
panov ©   (2004-04-28 12:02) [9]

>Андрей Сенченко ©   (28.04.04 11:59) [8]

а, если это имеешь ввиду, так исправляется парой дополнительных строк.


 
GroZ   (2004-04-28 12:05) [10]

2 panov,
проверь на таком тесте:

nov-01-vtg-diagnostichn
ost-nekrasov
nov-01-vtg-diagnost-shi
shko
nov-01-vtg-ivc-lukshina
nov-01-vtg-ivc-muravyev

правильный ответ которого должен быть:
nov-01-vtg-diagnostichnost-nekrasov
nov-01-vtg-diagnost-shishko
nov-01-vtg-ivc-lukshina
nov-01-vtg-ivc-muravyev


 
GroZ   (2004-04-28 12:12) [11]

2 panov,
в следующий раз проверяй алгоритм прежде чем отправлять ...


 
panov ©   (2004-04-28 12:15) [12]

>GroZ   (28.04.04 12:12) [11]

С исходными данными все работает. Сейчас будет и с остальными работать.


 
panov ©   (2004-04-28 12:28) [13]

Исходные данные:

nov-01-vtg-diagnostichn
ostforfirstotdel-nekras
ov
nov-01-vtg-diagnost-shi
shko
nov-01-vtg-ivc-lukshina
nov-01-vtg-ivc-muravyev

procedure TForm1.Button3Click(Sender: TObject);
var
List1,List2: TStringList;
i,j,Counter: Integer;
isFirstStr: Boolean;
begin
List1 := TStringList.Create;
List2 := TStringList.Create;
try
  List1.LoadFromFile("SrcFile.txt");

  isFirstStr := True;
  for i := 0 to List1.Count-1 do
  begin
    Counter := 0;
     for j := 1 to Length(List1[i]) do if List1[i][j]="-" then Inc(Counter);
     if Counter>2
       then List2.Add(List1[i])
       else List2[List2.Count-1] := List2[List2.Count-1]+List1[i];
  end;
  ListBox1.Items.Assign(List2);
finally
  List1.Free;
  List2.Free;
end;

end;


 
Anatoly Podgoretsky ©   (2004-04-28 12:55) [14]

Pos(максимально_длинная_левая_часть, )
пока по исходным данным это nov-01-vtg-


 
han_malign ©   (2004-04-28 12:56) [15]

>Андрей Сенченко ©   (28.04.04 11:59) [8]
- во придрались, главное идея, а необходимые условия можно и додумать...
(("nov-"<>copy(List1[i],1,4))or(Length(List1[i])<23))


 
panov ©   (2004-04-28 12:58) [16]

>han_malign ©   (28.04.04 12:56) [15]
>Anatoly Podgoretsky ©   (28.04.04 12:55) [14]

-))

Так вторая строка тоже может быть длиной 23...
И начинаться не с nov... я так понял, что nov - это ноябрь...


 
Anatoly Podgoretsky ©   (2004-04-28 12:59) [17]

Если довести дело до абсурда, то задача решения не имеет!

nov-01-vtg-diagnostichn
nov-01-vtg-diagnostichn
nov-01-vtg-diagnostichn

Вот здесь первая и вторая строки это одна строка, а третья это другая.


 
panov ©   (2004-04-28 13:10) [18]

>Anatoly Podgoretsky ©   (28.04.04 12:59) [17

ага!

Вот потому первое решение и есть рабочее для первоначально приведенных данных.


 
Tornado ©   (2004-04-28 13:26) [19]

ребята всем огромное спасибо, особенно >>panov ©   (28.04.04 13:10) [18]!

P.S. а "nov" - это от "Новгород", такая у нас принята система адресации в корпоративной почтовой системе Lotus ccMail


 
Андрей Сенченко ©   (2004-04-28 14:10) [20]

han_malign ©   (28.04.04 12:56) [15]

Не придрался, а дал неучтенный Сашей вариант переноса строк, при котором разделитель "-" окажется в перенесенной строке.

Anatoly Podgoretsky ©   (28.04.04 12:59) [17]

До абсурда эту задачу довести сложно, просто необходимо просмотреть все возможные виды переноса, желательно конечно иметь данные о максимальной длине строки.
Условно говоря в последнем приведенном решении не учтены всего-лишь 2 варианта
- перенос в 2 и больше строк
- сдвоенные фамилии типа novikov-zengelshuher, оказавшиеся в переносе.


 
Anatoly Podgoretsky ©   (2004-04-28 14:25) [21]

а если комбинация "nov-01-vtg-" в принципе не возможна для дополнительных строк, то задача сводитка к анализу if POS()=1 then первая строка else дополнительные строки. А сами строки как известно склеиваются оператором + или функцией concat.



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.025 c
3-1082128389
начинаю
2004-04-16 19:13
2004.05.16
про TIBTable


1-1083232433
KEBZ
2004-04-29 13:53
2004.05.16
Text


14-1082738176
VictorT
2004-04-23 20:36
2004.05.16
Не могу найти... Как в РТФ описываются таблицы?


3-1082600460
Марат
2004-04-22 06:21
2004.05.16
Запрос


1-1083077698
Алексей Петухов
2004-04-27 18:54
2004.05.16
полное имя файла