Текущий архив: 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.49 MB
Время: 0.136 c