Войти

Показать полную графическую версию : [решено] Парсинг строк


Painkiller
29-09-2018, 18:29
Всем привет! Нужна помощь! Имеем текст (сам текст прикрепил к сообщению).
В нём есть колонки 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.

Iska
29-09-2018, 19:11
Painkiller, читайте из файла построчно, затем делите каждую строку тупо по позициям.

Painkiller
29-09-2018, 19:28
Iska, а я что делаю ? Проблема в том, что я не знаю, что делать, если в колонке пустые строки. Как реализовать, чтобы пустые строки в колонке игнорировались?

Painkiller
29-09-2018, 20:43
Вопрос решён!

opel431
29-09-2018, 23:09
Зная Вашу особенность разбираться во всем самому, просто советую, посмотрите на следующие функции и свойства в Delphi:
- разделение строки
1. Classes.TStrings.DelimitedText, Classes.TStrings.StrictDelimiter
2. Classes.ExtractStrings
3. StrUtils.SplitString
- пустые строки
1. Lenght()

Iska
29-09-2018, 23:30
- пустые строки
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
1. Classes.TStrings.DelimitedText, Classes.TStrings.StrictDelimiter
2. Classes.ExtractStrings
3. StrUtils.SplitString
- пустые строки
1. Lenght() »
Я всё это и кучу других функций перепробовал, результат был не тот, что хотелось и ошибок не было. Просто в колонке где было пусто сдвигались строки с другой колонки. А решил я свою проблему перебором строк + функцией Copy ( S; Index, Count: Integer ): string + кое где StringReplace;
Да нет там у него никаких «пустых строк». Он вместо того, чтобы извлекать из строк: »
Есть строки, слепые что ли ? От Compressed в txt файле вниз посмотрите
Тут вопрос решён.
opel431, у меня теперь другая проблема . Например задаю размер файла в ProgressBar1.Max и получаю ошибку, например размер файла ProgressBar1.Max =28500915651, я так понял превысил максимально допустимое значение, так как с короткими всё гуд. Как решить ? Пока не придумал. =( Int64 тоже не помогает

Iska
30-09-2018, 07:48
Есть строки, слепые что ли ? От Compressed в txt файле вниз посмотрите »
Там нет «пустых строк». Которые бы требовалось «игнорировать». Там есть пробелы.

А решил я свою проблему перебором строк + функцией Copy ( S; Index, Count: Integer ): string »
Что и требовалось — извлекать подстроки с фиксированных позиций, а не делить по разделителю.

opel431
30-09-2018, 10:43
"Пустые строки", имелось ввиду "пустые" подстроки в строке, которые при парсинге добавляются в массив строк, уже как строка.

Вам видимо нужно сохранять общее количество строк в колонках (SL.Count)? Что Вам мешает заменить пустую строку на приемлемый для Вас результат
if s = '' then //или Lenght(s)
s := 'empty str'; //или s := '--------'

у меня теперь другая проблема . Например задаю размер файла в ProgressBar1.Max и получаю ошибку, например размер файла ProgressBar1.Max =28500915651, я так понял превысил максимально допустимое значение, так как с короткими всё гуд. Как решить ? »
А зачем вам побайтно выводить результат? Разделите полученный размер файла, например, на 1024 (килобайт) и добавьте в свойство PB
pb1.Max := Round(size / 1024); или просто, используйте свойство pb1.Style =pbstMarquee

Iska
30-09-2018, 12:08
"Пустые строки", имелось ввиду "пустые" подстроки в строке, которые при парсинге добавляются в массив строк, уже как строка. »
Так не было этого-то.

opel431
30-09-2018, 12:48
Так не было этого-то »
Привет! Так нам всем свойственно иногда не раскрывать мысль до конца, считаем, что "раз я так думаю, то остальное можно упустить", как само-собой разумеющее

Iska
30-09-2018, 13:23
opel431, это да, сам такой :).




© OSzone.net 2001-2012