Autor Téma: Podivně rozparsovaný řetězec - ExtractStrings  (Přečteno 793 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Podivně rozparsovaný řetězec - ExtractStrings
« kdy: 21-09-2018, 15:01:29 »
Pokouším se rozparsovat soubor s překlady bible. V podstatě je to csv, ale místo středníků jsou taby. První sloupec je název kapitoly a pak jsou jednotlivé překlady pro dané místo v knize. Nyní jsem zjistil, že ten Ectract Strings parsuje nějak podivně,

Kód: Delphi [Vybrat]
  1. s := char(9);
  2. ExtractStrings([s[1]],[],PChar(SourceList[i]), line);
protože Genesis 3:16 vidí počet sloupců line.count = 3. Ale má tam být 8 (pro daný řádek). Čím to může být?

Kód: Delphi [Vybrat]
  1.   SourceList.LoadFromFile('b:\bible_.txt');
  2.   n := 0;
  3.   for i:=0 to SourceList.count-1 do
  4.     begin
  5.       line := TStringList.Create;
  6.       if i=0 then // header
  7.         begin
  8.           // VYTVOŘIT ZKRATKY PRO PŘEKLADY BIBLE
  9.           SourceList[i] := stringreplace(SourceList[i], '''s', '',[rfReplaceAll]);
  10.           SourceList[i] := stringreplace(SourceList[i], '-', ' ',[rfReplaceAll]);
  11.           s := SourceList[i];
  12.           for a := 1 to length(s) do
  13.             if ord(s[a])>90 then
  14.               s[a] := ' ';
  15.           SourceList[i] := stringreplace(s, ' ', '',[rfReplaceAll]);
  16.         end;
  17.  
  18.       s := char(9);
  19.       ExtractStrings([s[1]],[],PChar(SourceList[i]), line);
  20.       place := line.Strings[0];
  21.       s1 := line.Strings[1];
  22.       s2 := line.Strings[2];
  23.       s3 := line.Strings[3];
  24.       if line.count<5 then
  25.         begin
  26.           showmessage('So strange. The line (cols) count is: ' + inttostr(line.count) );
  27.           showmessage(SourceList[i]);
  28.         end;
  29.  

Podmínka na řádku 24 je true, a vyskočí okno.

Kousek posílám:
https://paste.ofcode.org/gZf9YkvGW3dwKW2r6z7pYF
« Poslední změna: 21-09-2018, 15:07:49 od vangog »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2869
  • Karma: 106
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Podivně rozparsovaný řetězec - ExtractStrings
« Odpověď #1 kdy: 21-09-2018, 16:04:58 »
Na tom pastebin není přesně ten Genesis 3:16, těžko říct.

To barevné schéma máš k vůli zraku?
Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:Podivně rozparsovaný řetězec - ExtractStrings
« Odpověď #2 kdy: 21-09-2018, 21:43:06 »
Na tom pastebin není přesně ten Genesis 3:16, těžko říct.

To barevné schéma máš k vůli zraku?

Oprava:
https://paste.ofcode.org/3az89MahAuXnPGicV6AD7AT

Jo kvůli zraku

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:Podivně rozparsovaný řetězec - ExtractStrings
« Odpověď #3 kdy: 21-09-2018, 22:08:25 »
Zdá se že to tělá ten apostrof ve slově:

husband's

Chyba je ve třetím sloupci, kde se vyskytuje několik nerosparsovaných řetězců.

Podívejte se na tenhle zkrácený zkušební vzorek:
https://paste.ofcode.org/Nygm49Ygmkdtn8r7x7x7R3

Na fotce přikládám screenshot třetího sloupce.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:Podivně rozparsovaný řetězec - ExtractStrings
« Odpověď #4 kdy: 21-09-2018, 22:54:32 »
Třetí sloupec myslel jsem line[3] ...

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:Podivně rozparsovaný řetězec - ExtractStrings
« Odpověď #5 kdy: 22-09-2018, 00:52:52 »
Když tedy změním ve třetím (resp. 4.) sloupci THREE's na THREEs tak to normálně projde, ale s tím apostrofem to neprojde a hodí chybu kvůli špatně rozparsovanému stringu.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3180
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:Podivně rozparsovaný řetězec - ExtractStrings
« Odpověď #6 kdy: 22-09-2018, 07:30:26 »
Excellent
Rated 1 time
Když tedy změním ve třetím (resp. 4.) sloupci THREE's na THREEs tak to normálně projde, ale s tím apostrofem to neprojde a hodí chybu kvůli špatně rozparsovanému stringu.
Tohle http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.ExtractStrings si cti tak dlouho, nez to pochopis

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:Podivně rozparsovaný řetězec - ExtractStrings
« Odpověď #7 kdy: 22-09-2018, 10:37:28 »
Tohle http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.ExtractStrings si cti tak dlouho, nez to pochopis

Už jsem to našel:
'Separators are ignored when inside a quoted string until the final end quote.'

Napsal jsem si vlastní funci, extractstrings je na nic.
« Poslední změna: 22-09-2018, 10:39:07 od vangog »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3180
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:Podivně rozparsovaný řetězec - ExtractStrings
« Odpověď #8 kdy: 22-09-2018, 12:12:25 »
Napsal jsem si vlastní funci, extractstrings je na nic.
Neni na nic - jen byla navrzena s zretelem na vlastnosti parsovani CSV formatu a Delphi beznou funkci String.Split() do nedavna nemel.