[Pascal] gedeelte lezen en wegschrijven

Pagina: 1
Acties:

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 01-09 09:29

Schonhose

Retro Icoon

Topicstarter
Ik heb een file die onder andere bestaat uit het volgende segment:
code:
1
2
3
4
5
6
7
8
9
10
1,"",3.516,870.39,0.02,0.02
2,"",4.185,496.94,0.00,0.00
3,"",4.600,992721.68,81.91,81.91
4,"",6.181,142398.93,1.09,1.09
5,"",6.754,6466.41,0.09,0.09
6,"",6.977,420648.06,2.02,2.02
7,"",7.558,1.02e+06,5.84,5.84
8,"",8.368,2960.17,0.02,0.02
9,"",8.673,212008.19,1.10,1.10
10,"",11.279,29884.68,0.20,0.20

Hiervan moet ik elke kolom (gescheiden door een komma) inlezen in een array.

De lengte van de kolom varieert. (is nu 10)

Mijn Pascal is heel roestig dus ik kom er zo even niet uit.

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


  • corani
  • Registratie: December 2000
  • Laatst online: 05-10-2017

corani

__,,,_(^_^)_,,,__

'k moet heel hard nadenken...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var f : text;
    i, counter : Integer;
    line : String;

begin
  assign(f, "file");
  reset(f);
  counter := 1;
  while (not eof(f))
  begin
    readln(f, line);
    for i := 1 to 5 do
    begin
    deArray[counter][i] := copy(line, 1, pos(line, ","));
    delete(line, 1, pos(line, ",") + 1);
    end;
    deArray[counter][6] = line;
    inc(counter);
  end;
end.

Er zullen nog wel wat fouten in zitten, want sinds ik C++ gewend ben kan ik bijna geen Pascal meer :)

Laat me nou toch eens met rust man!
Iedereen die in telekinese gelooft, steek a.u.b. mijn hand op


  • Schonhose
  • Registratie: April 2000
  • Laatst online: 01-09 09:29

Schonhose

Retro Icoon

Topicstarter
Het mag ook in C++ hoor :)

Ik heb beide programeer talen ooit eens gehad tijdens mijn studie, maar ben het nu hopeloos vergeten.

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

volgende is een Pascal voorbeeld.. weet alleen niet meer precies in welke unit die string functies (Trim, Delete enzo) zitten, ik dacht STRINGS maar dat is geloof ik niet goed..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Program Test;

Uses
  Strings;

Const
  Filename = 'blabla.txt';
  Tab = #9;

Type
  pCustomRecord = ^CustomRecord;
  CustomRecord = record
    Column1 : String;
    Column2 : String;
    Column3 : String;
    Column4 : String;
  end; {record}

Var
  SrcFile : Text;
  strRead : String;
  MyArray : Array[1..10] of pCustomRecord;
  CurrentRec : Word;

Procedure ReadRecord(Line : String);
var
  I, J : Byte;
  StrSub : String;
Begin
  I := Pos(Tab, Line);
  J := 1;
  Inc(CurrentRec);
  While I <> 0 Do Begin
    { Copy field value from data stream }
    StrSub := Trim(Copy(Line, 1, I-1));
    { Remove field from data stream }
    Delete(Line, 1, I);}

    Case J Of
    01 : MyArray[CurrentRec]^.Column1 := StrSub;
    02 : MyArray[CurrentRec]^.Column2 := StrSub;
    03 : MyArray[CurrentRec]^.Column3 := StrSub;
    04 : MyArray[CurrentRec]^.Column4 := StrSub;
    End; {case}

    { Next field }
    Inc(J);
    { Search for next Tab-character in stream }
    I := Pos(Tab, Line);
  End;
End;


{-- MAIN PROGRAM --}
Begin
  CurrentRec := 0;
  Assign(SrcFile, Filename);
  Reset(SrcFile);

  While Not EOF(SrcFile) Do
  Begin
    ReadLn(SrcFile, strRead);
    ReadRecord(strRead);
  End;

End.

8-) lapje tekst, niet?


je als je ook bytes enzo wil gebruiken (het zijn nu allemaal strings) dan moet je daar waar nodig (in die case statement) Str2Int(string, Integer) gebruiken, zit ook in zo'n strings-unit, misschien was het SYSUTILS :?

[edit]
en ook nog.. die constante Tab is in jou geval de ascii code van de komma (44 dus) en niet 9, dat is de TAB (had ik overgenomen uit standaard proggie)

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Schonhose
  • Registratie: April 2000
  • Laatst online: 01-09 09:29

Schonhose

Retro Icoon

Topicstarter
En ik al maar denken dat het simpel te doen moest zijn. |:(

De bedoeling is verder dat ik kolom 1 en kolom 4 wegschrijf in een andere file....

BdR, hoe leuk jouw code er ook uitziet, ik zou bij god niet weten hoe ik daarna kolom 1 en kolom 4 wegschrijf naar een file.

Klopt het dat ik maximaal 4 kolomen kan lezen met jouw file?
Ik zal eens even kijken.

Het lukt me al niet eens meer om een meerdimensionale array te declareren en ook daadwerkelijk te vullen. Kijken of ik nog oude source code kan vinden waarin me dit wel lukt...

[edit]
Trim is geen onderdeel van het standaard BP 7.0 units setje..

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


  • corani
  • Registratie: December 2000
  • Laatst online: 05-10-2017

corani

__,,,_(^_^)_,,,__

Op woensdag 30 januari 2002 15:15 schreef Morpheus25 het volgende:
En ik al maar denken dat het simpel te doen moest zijn. |:(
Die van mij was toch vrij simpel dacht ik :)
Het lukt me al niet eens meer om een meerdimensionale array te declareren en ook daadwerkelijk te vullen. Kijken of ik nog oude source code kan vinden waarin me dit wel lukt...
Die was ik nog ff vergeten ja..
code:
1
  var deArray: ARRAY[1..100] OF ARRAY[1..6] OF STRING[10];
De bedoeling is verder dat ik kolom 1 en kolom 4 wegschrijf in een andere file....
Dan wordt het nog makkelijker.. nix prutsen met arrays of records etc. gewoon:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var f_in, f_uit : text;
    i, counter  : Integer;
    line      : String;
    col1, col4  : String;

begin
  assign(f_in, "file.in");
  assign(f_uit, "file.uit");
  reset(f_in);
  rewrite(f_uit);
  counter := 1;
  while (not eof(f))
  begin
    readln(f_in, line);
    col1 := copy(line, 1, pos(line, ","));
    for i := 1 to 3 do
    begin
    delete(line, 1, pos(line, ",") + 1);
    end;
    col4 := copy(line, 1, pos(line, ","));
    inc(counter);

    writeln(f_uit, col1, ",", col4);
  end;
  close(f_uit);
  close(f_in);
end.

Laat me nou toch eens met rust man!
Iedereen die in telekinese gelooft, steek a.u.b. mijn hand op


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

nog meer oplossingen aandragen.. om dat weer weg te schrijven zoals jij dat wilt, dan moet je even extra variabelen declaren:
code:
1
2
3
Var
  DestFile : Text;
  outputline : String;

en het hoofd programma uitbreiden met
code:
1
2
3
4
5
6
7
8
Assign(DestFile, "output.txt");
Rewrite(DestFile);
For i := 1 to CurrentRec Do
Begin
  outputline := MyArray[CurrentRec]^.Column1 + ', ' + MyArray[CurrentRec]^.Column4;
  WriteLn(DestFile, outputline);
End;
Close(DestFile);

en.. natuurlijk kan je wel meer dan 4 kolommen lezen, dat stukje van mij was gewoon een aanzet tot een oplossing (net als dit laatste voorbeeldje).

maarrrrrr.. kan je het niet makkelijker inlezen in MS-Excel dan komt er vanzelf zo'n open-wizard, die vraagt om welk soort delimiter je wil (komma dus) dan de kolommen bewerken en weer opslaan als text..

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Schonhose
  • Registratie: April 2000
  • Laatst online: 01-09 09:29

Schonhose

Retro Icoon

Topicstarter
Op woensdag 30 januari 2002 15:37 schreef corani het volgende:
code:
1
2
<snip>
    col1 := copy(line, 1, pos(line, ","));
moet zijn:
code:
1
  col1 := copy(line, 1, pos(',', line));

Na minor aanpassingen werkt hij eindelijk :)

Nu moet ik het probleem van de header en de footer nog zien op te lossen....
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
hier staat een heleboel rotzooi +

"===================================================================================================================================="


"DEFAULT REPORT"
"Peak","Component","Time","Height","Area","Norm. Area",
"#","Name","[min]","[uV]","[%]","[%]",
"------------------------------------------------------------------------------------------------------------------------------------"
1,"",3.516,870.39,0.02,0.02
2,"",4.185,496.94,0.00,0.00
3,"",4.600,992721.68,81.91,81.91
4,"",6.181,142398.93,1.09,1.09
5,"",6.754,6466.41,0.09,0.09
6,"",6.977,420648.06,2.02,2.02
7,"",7.558,1.02e+06,5.84,5.84
8,"",8.368,2960.17,0.02,0.02
9,"",8.673,212008.19,1.10,1.10
10,"",11.279,29884.68,0.20,0.20
11,"",12.210,220.46,0.01,0.01

....

53,"",43.746,106.05,0.00,0.00
54,"",45.094,282.37,0.00,0.00
55,"",46.233,106.12,0.00,0.00
"------------------------------------------------------------------------------------------------------------------------------------"
"","","",3.99e+06,100.00,100.00

"Missing Component Report"
"Component", "Expected Retention (Calibration File)"
"---------------------------------------------------------------"
"           All components were found"

Dat moet ik er nu ook nog uit zien te slopen. Suggesties??
Op woensdag 30 januari 2002 15:46 schreef BdR het volgende:
maarrrrrr.. kan je het niet makkelijker inlezen in MS-Excel dan komt er vanzelf zo'n open-wizard, die vraagt om welk soort delimiter je wil (komma dus) dan de kolommen bewerken en weer opslaan als text..
Op zich wel, ware het niet dat het de bedoeling is dat een hele directory in 1x geconverteerd moet worden naar een ander formaat. (Dit lukt nog met VBA)

Verder is het de bedoeling dat het programma om de zoveel minuten de directory checked of er een nieuwe file is en deze direct omzet.

Hij moet dus in de achtergrond draaien (en dit kan volgens mij niet bij Excel)

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

als dit geheel in een windows omgeving moet worden uitgevoerd, dan zou ik VB gebruiken, want:
1) die TRIM en COPY string functies heb je standaard
2) je kan met een timer object simpel weg je programmaatje om de zoveel tijd laten uitvoeren..
3) VB rulez ;) (okee is niet waar, maar het is wel erg makkelijk voor dit soort dingen)

en ik weet niet precies wat je bedoeld met header en footer, maar ik neem aan dat je die wilt herkennen zodat die niet ook omgezet wordt? :? dan zou je kunnen checken op die "-----------------" enzo..

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Schonhose
  • Registratie: April 2000
  • Laatst online: 01-09 09:29

Schonhose

Retro Icoon

Topicstarter
Op woensdag 30 januari 2002 16:10 schreef BdR het volgende:
als dit geheel in een windows omgeving moet worden uitgevoerd, dan zou ik VB gebruiken
Denk dat ik dat ook maar ga doen inderdaad... pff, wat een gedoe in pascal....

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005

Pagina: 1