Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Парсинг строк (http://forum.oszone.net/showthread.php?t=336924)

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.


Iska 29-09-2018 19:11 2833527

Painkiller, читайте из файла построчно, затем делите каждую строку тупо по позициям.

Painkiller 29-09-2018 19:28 2833531

Iska, а я что делаю ? Проблема в том, что я не знаю, что делать, если в колонке пустые строки. Как реализовать, чтобы пустые строки в колонке игнорировались?

Painkiller 29-09-2018 20:43 2833542

Вопрос решён!

opel431 29-09-2018 23:09 2833570

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

Iska 29-09-2018 23:30 2833575

Цитата:

Цитата 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 тоже не помогает

Iska 30-09-2018 07:48 2833589

Цитата:

Цитата Painkiller
Есть строки, слепые что ли ? От Compressed в txt файле вниз посмотрите »

Там нет «пустых строк». Которые бы требовалось «игнорировать». Там есть пробелы.

Цитата:

Цитата Painkiller
А решил я свою проблему перебором строк + функцией Copy ( S; Index, Count: Integer ): string »

Что и требовалось — извлекать подстроки с фиксированных позиций, а не делить по разделителю.

opel431 30-09-2018 10:43 2833608

"Пустые строки", имелось ввиду "пустые" подстроки в строке, которые при парсинге добавляются в массив строк, уже как строка.

Вам видимо нужно сохранять общее количество строк в колонках (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

Iska 30-09-2018 12:08 2833628

Цитата:

Цитата opel431
"Пустые строки", имелось ввиду "пустые" подстроки в строке, которые при парсинге добавляются в массив строк, уже как строка. »

Так не было этого-то.

opel431 30-09-2018 12:48 2833638

Цитата:

Цитата Iska
Так не было этого-то »

Привет! Так нам всем свойственно иногда не раскрывать мысль до конца, считаем, что "раз я так думаю, то остальное можно упустить", как само-собой разумеющее

Iska 30-09-2018 13:23 2833647

opel431, это да, сам такой :).


Время: 23:11.

Время: 23:11.
© OSzone.net 2001-