Wczytuję do ListView zawartość pliku .csv Plik UTF8 jest prosty w budowie, jednak pierwsza linijka zawiera 3 dodatkowe znaki o kodach: #239 #187 #191
Nic się w tym pliku nie zmienia, ale gdy wciskam klawisz wczytywania, tylko co piąty raz odczytany kod znaku ma tą samą wartość:
procedure TForm5.btWczytajUliceClick(Sender: TObject);
const
nKolumnaMax: integer=3; //poprawić aWektor przy zmianie
var
TFwejscie: TextFile;
sPlikWej: string;
sBuf, sRoboczy: string;
ListItem: TListItem;
nCounter: integer;
aWektor: array[0..3] of string; //nKolumnaMax
nZnak, jj,ii, nPoz: integer;
lPierwsza: boolean;
sKomenda: string;
begin
if lvListaMiast.ItemIndex=-1 then
begin
MessageBox(0,'Wybierz miasto','Brak wyboru',MB_OK+MB_ICONWARNING);
EXIT;
end;
lPierwsza:=true;
sPlikWej:='ULICE'+lvListaMiast.Selected.Caption+'.csv';
parametry.miasto_czytane:=lvListaMiast.Selected.SubItems[0]; //id_miasta do klasy
if not FileExists(sPlikWej) then
begin
MessageBox(0,pchar('Brak pliku: '+sPlikWej),'BŁĄD!!',MB_OK+MB_ICONWARNING);
EXIT;
end;
AssignFile(TFwejscie,sPlikWej);
ProgressBar1.Max:=1000;
nCounter:=0;
try
Reset(TFwejscie);
lvUlice.Clear;
while not eof(TFwejscie) do
begin
Readln(TFwejscie,sBuf);
ProgressBar1.Position:=nCounter;
inc(nCounter);
//rozbiór na kawałki po tabulatorze
sRoboczy:=UTF8ToString(sBuf);
nZnak:=ord(LeftStr(sBuf,1)); <----------------- tu czytam pierwszy znak
if lPierwsza then
begin
Memo1.Lines.Add(IntToStr(nZnak));
lPierwsza:=false;
end;
if nZnak=12198892 then //w pierwszej linijce dodatkowe śmieci, wartość dziwna, ale odczytana z debugera
sRoboczy:=RightStr(sRoboczy,Length(sRoboczy)-1);
for ii := 0 to nKolumnaMax do
begin
nPoz:=pos(';',sRoboczy);//gdzie jest tabulator
if ii=nKolumnaMax then
nPoz:=100; //ostatnia nie jest zamknięta tabulatorem
aWektor[ii]:=leftStr(sRoboczy,nPoz-1);
sRoboczy:=Copy(sRoboczy,nPoz+1,length(sRoboczy));//kopiuje resztę na prawo po tabulatorze
end;
ListItem:=lvUlice.Items.Add;
ListItem.Caption:=IntToStr(nCounter); //0
// for ii := 0 to nKolumnaMax do
//gubimy kolumne z ul.
ListItem.SubItems.Add(aWektor[0]); //0 teryt
//ul. gubi
ListItem.SubItems.Add(aWektor[2]); //1 ulica1
ListItem.SubItems.Add(''); //2 puste na numery
ListItem.SubItems.Add(''); //3 puste na obwód
ListItem.SubItems.Add(''); //4 puste na ilość trafień
if aWektor[3]<>'NULL' then
ListItem.SubItems.Add(aWektor[3])
else
ListItem.SubItems.Add(''); //5 ulica2
end;
finally
CloseFile(TFwejscie);
end;
Kolejne uruchamianie odczytu pliku, dla pierwszej linijki daje takie wyniki (kod pierwszego znaku):
Memo1
12198844
12198916
12198868
12198892
12198964
12198844 <----powtarza cykl
12198916
12198868
Początek zawartości pliku:
00090;ul.;Abrahama;Antoniego
00097;ul.;Achillesa;NULL
00134;ul.;Afrodyty;NULL
Oczywiście mogę inaczej obejść ten problem:
nZnak:=ord(sBuf[1])
ale ciekawi mnie, jakim cudem w tej konstrukcji, ten sam plik zwraca różne wyniki?