Avatar billede farouche Nybegynder
16. oktober 2000 - 23:03 Der 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 ?

Jeg har prøvet med :

if Ord(line[i]) = 10 og 12 og 13

men det virker ikke :o(


Hvad gør jeg ?
Avatar billede hatecaps Nybegynder
16. oktober 2000 - 23:40 #1
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;

burde i hvert fald virke

ha\' det godt

hatecaps :-)
Avatar billede farouche Nybegynder
16. oktober 2000 - 23:55 #2
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;
Avatar billede kokoko Nybegynder
17. oktober 2000 - 01:25 #3
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;
Avatar billede hatecaps Nybegynder
17. oktober 2000 - 09:21 #4
nu kan jeg jo ikke se indholdet af adskiltegn mende to linier

line := RemoveSpaces(adskiltegn, Line);
og
if Ord(line[i]) = adskiltegn then

får mig til at tro at du først fjerner all \"adskiltegn\" for derefter at lede efter dem ?!?! Kan det være rigtigt ?
Avatar billede tknudsen Nybegynder
17. oktober 2000 - 10:15 #5
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!?).

Avatar billede tknudsen Nybegynder
17. oktober 2000 - 10:17 #6
ehh - readblock hedder ikke readblock, men blockread...

:-)
Avatar billede qdh Nybegynder
17. oktober 2000 - 19:06 #7
Hvordan fanden har I lært det crap???

:-) qdh
Avatar billede tknudsen Nybegynder
17. oktober 2000 - 19:15 #8
c:\\program files\\borland\\delphi5\\help\\*.hlp
og
c:\\program files\\common files\\borland shared\\mshelp\\*.hlp

+ sføli her på eksperten - btw - hvem skriver de idiotiske \'citater\' i øverste højre hjørne ?

:-) selv
Avatar billede farouche Nybegynder
18. oktober 2000 - 18:27 #9
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester