 |
|
Painkiller |
29-09-2018 18:29 2833521 |
Парсинг строк
Вложений: 1
- prim.7z (783 bytes, скачиваний: 16)
Всем привет! Нужна помощь! Имеем текст (сам текст прикрепил к сообщению).
В нём есть колонки Date Time Attr Size Compressed Name со списком. Нужно после парсинга , чтобы я мог выводить отдельно по желанию список каждой колонки в memo например
Пример :
Код:
Список колонки Name:
-------------------
sevenzip
sevenzip\Win32
sevenzip\Win32\Debug
sevenzip\__history
sevenzip\__recovery
sevenzip\Project1.dproj
sevenzip\Project1.dproj.local
sevenzip\Project1.identcache
sevenzip\Project1.res
sevenzip\Project1.stat
....
У меня получилось вывести список под Date, Time , Attr, Size, а вот с колонками Compressed, Name проблемы , так как в колонке Compressed есть пустые строки и у меня колонки Compressed и Name совмещаются =(
Мой код :
Код:
procedure TForm1.Button2Click(Sender: TObject);
VAR
F,D: TStringList;
I:INTEGER;
begin
d := TStringList.Create;
F:= TStringList.Create;
d.LoadFromFile('C:\ping.txt');
d.Delete(D.Count-1);
d.Delete(D.Count-1);
for i := 19 to D.Count-1 do BEGIN
F.Clear;
F.CommaText:= D.Strings[i];
MEMO1.Lines.Add(F.Strings[4]);
END;
F.Free;
d.Free;
end;
end.
|
Painkiller, читайте из файла построчно, затем делите каждую строку тупо по позициям.
|
Painkiller |
29-09-2018 19:28 2833531 |
Iska, а я что делаю ? Проблема в том, что я не знаю, что делать, если в колонке пустые строки. Как реализовать, чтобы пустые строки в колонке игнорировались?
|
Painkiller |
29-09-2018 20:43 2833542 |
Вопрос решён!
|
Зная Вашу особенность разбираться во всем самому, просто советую, посмотрите на следующие функции и свойства в Delphi:
- разделение строки
1. Classes.TStrings.DelimitedText, Classes.TStrings.StrictDelimiter
2. Classes.ExtractStrings
3. StrUtils.SplitString
- пустые строки
1. Lenght()
|
Цитата:
Цитата opel431
- пустые строки
1. Lenght() »
|
Да нет там у него никаких «пустых строк». Он вместо того, чтобы извлекать из строк:
Примеры таких строк (из приложенного выше файла
Код:
2018-08-13 01:15:31 D.... 0 0 sevenzip
2018-08-05 01:56:56 D.... 0 0 sevenzip\Win32
2018-08-05 03:33:09 D.... 0 0 sevenzip\Win32\Debug
2018-08-05 03:30:27 D.H.. 0 0 sevenzip\__history
2018-08-13 01:15:31 D.H.. 0 0 sevenzip\__recovery
2018-08-05 01:56:56 ....A 234 88306 sevenzip\Project1.dpr
2018-08-05 01:56:55 ....A 29458 sevenzip\Project1.dproj
2018-08-05 01:56:56 ....A 2457 sevenzip\Project1.dproj.local
2018-08-13 01:15:31 ....A 63 sevenzip\Project1.identcache
2018-08-05 01:56:56 ....A 59412 sevenzip\Project1.res
2018-08-13 01:15:31 ....A 163 sevenzip\Project1.stat
2016-12-09 23:46:18 ....A 69906 sevenzip\sevenzip.pas
2018-08-05 03:14:40 ....A 623 sevenzip\Unit1.dfm
2018-08-05 03:25:14 ....A 1025 sevenzip\Unit1.pas
2018-08-05 01:57:30 ....A 76147 sevenzip\Win32\Debug\sevenzip.dcu
2018-08-05 03:30:28 ....A 6466 sevenzip\Win32\Debug\Unit1.dcu
2018-08-05 01:56:50 ....A 329 sevenzip\__history\Unit1.dfm.~1~
2018-08-05 01:56:56 ....A 361 sevenzip\__history\Unit1.pas.~1~
2017-04-29 13:15:12 ....A 1099776 2471456 sevenzip\Win32\Debug\7z.dll
2018-08-13 01:12:53 ....A 11234841 sevenzip\Win32\Debug\Project1.exe
подстроки фиксированной длины, пытался сплитить эти строки по разделителю. И, поскольку число получаемых таким образом элементов для разных строк было различным, закономерно на некоторых строках получал ошибку Index out of range при попытке обращения к элементу по несуществующему индексу.
|
Painkiller |
30-09-2018 02:11 2833583 |
Цитата:
Цитата opel431
1. Classes.TStrings.DelimitedText, Classes.TStrings.StrictDelimiter
2. Classes.ExtractStrings
3. StrUtils.SplitString
- пустые строки
1. Lenght() »
|
Я всё это и кучу других функций перепробовал, результат был не тот, что хотелось и ошибок не было. Просто в колонке где было пусто сдвигались строки с другой колонки. А решил я свою проблему перебором строк + функцией Copy ( S; Index, Count: Integer ): string + кое где StringReplace;
Цитата:
Цитата Iska
Да нет там у него никаких «пустых строк». Он вместо того, чтобы извлекать из строк: »
|
Есть строки, слепые что ли ? От Compressed в txt файле вниз посмотрите
Тут вопрос решён.
opel431, у меня теперь другая проблема . Например задаю размер файла в ProgressBar1.Max и получаю ошибку, например размер файла ProgressBar1.Max =28500915651, я так понял превысил максимально допустимое значение, так как с короткими всё гуд. Как решить ? Пока не придумал. =( Int64 тоже не помогает
|
Цитата:
Цитата Painkiller
Есть строки, слепые что ли ? От Compressed в txt файле вниз посмотрите »
|
Там нет «пустых строк». Которые бы требовалось «игнорировать». Там есть пробелы.
Цитата:
Цитата Painkiller
А решил я свою проблему перебором строк + функцией Copy ( S; Index, Count: Integer ): string »
|
Что и требовалось — извлекать подстроки с фиксированных позиций, а не делить по разделителю.
|
"Пустые строки", имелось ввиду "пустые" подстроки в строке, которые при парсинге добавляются в массив строк, уже как строка.
Вам видимо нужно сохранять общее количество строк в колонках (SL.Count)? Что Вам мешает заменить пустую строку на приемлемый для Вас результат
Код:
if s = '' then //или Lenght(s)
s := 'empty str'; //или s := '--------'
Цитата:
Цитата Painkiller
у меня теперь другая проблема . Например задаю размер файла в ProgressBar1.Max и получаю ошибку, например размер файла ProgressBar1.Max =28500915651, я так понял превысил максимально допустимое значение, так как с короткими всё гуд. Как решить ? »
|
А зачем вам побайтно выводить результат? Разделите полученный размер файла, например, на 1024 (килобайт) и добавьте в свойство PB
Код:
pb1.Max := Round(size / 1024);
или просто, используйте свойство pb1.Style =pbstMarquee
|
Цитата:
Цитата opel431
"Пустые строки", имелось ввиду "пустые" подстроки в строке, которые при парсинге добавляются в массив строк, уже как строка. »
|
Так не было этого-то.
|
Привет! Так нам всем свойственно иногда не раскрывать мысль до конца, считаем, что "раз я так думаю, то остальное можно упустить", как само-собой разумеющее
|
opel431, это да, сам такой :).
|
Время: 23:11.
© OSzone.net 2001-