16. oktober 2000 - 23:03Der er
8 kommentarer og 1 løsning
Opdeling af LineFeed separerede text filer
Jeg er igang med at lave en funktion til at opdele tekstfiler i felter, der kan indlægges i en DB tabel.
Funktionen skal virke nogenlunde som tekst-inport funktionen i MS SQL server, hvor man vælger det tegn der adskiller felter samt en tekstkvalifikator.
Jeg har ingen problemer med at få det til at virke med kommaseparerede filer, men når det drejer sig om filer hvor felterne er separeret med LineFeed virker det ikke.
Når jeg importerer filen til SQL server siger den {CR} {LF} men den virker fint kun med {LF}
Jeg læser hver linie i teksten til en String.
Er der nogen der ved hvordan man finder denne LF \"karakter\" i denne string ?
hmm, uden at kunne se resten af den funktion hvor du gør det, vil jeg mene at du er på rette spor
function find_lf(s : string) : integer; var i : integer; begin result := 0; if length(s) = 0 then exit; for i := 1 to length(s) do begin if s[i] = #10 then begin result := i; exit; end; end; end;
jeg må give dig ret i at det burde virke, men det gør det ikke :o(
Her er hele koden :
function TConv.LineToSList(Line: String): TStrings; var i, prev, cur: Integer; begin result := TStringList.Create;
if tekstKval <> -1 then line := RemoveChars(TekstKval, Line); line := RemoveSpaces(adskiltegn, Line); prev := 1; cur := 1;
for i := 1 to length(Line) do begin if Ord(line[i]) = adskiltegn then begin cur := i; result.Add(Copy(line, prev, cur - prev)); prev := cur + 1; end; end; result.Add(Copy(line, prev, length(line) - prev + 1) ) end;
tjaaa... det lyder i mine øre meget som om der ikke findes en lf i din linje du prøver på at indlæse, men ellers vil jeg foreslå det her:
function TConv.LineToSList(Line: String): TStrings; var LFPos: Integer; begin result := TStringList.Create;
if tekstKval <> -1 then line := RemoveChars(TekstKval, Line); line := RemoveSpaces(adskiltegn, Line); prev := 1; cur := 1;
LFPos:=Pos(#10,Line); while LFPos>0 do begin if Line[LFPos-1]=#13 then result.Add(Copy(Line,1,LFPos-2)) else result.Add(Copy(Line,1,LFPos-1)); Delete(Line,1,LFPos); LFPos:=Pos(#10,Line); end; // måske skal der være en result.Add(Line); her // ikke sikker :-) end;
hvilken type er din fil pointer ? hvordan læser du linien fra filen ?
For at læse fra en fil hvor du er interreseret i at få tegn som CR og LF med vil jeg foreslå at du bruger datatypen file eller TFileStream og læser via read, readblock eller TFileStream.Read (jeg er ikke helt sikker på at den sidste metode er navngivet rigtigt!?).
Nu står jeg igen i en situation hvor jeg selv finder ud af hvorfor det ikke virker.
Simpelthen fordi, der er tale om en FixedWidth textfil, hvor de enkelte felter har et fast startsted
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.