| |
|
|
Matthias Badzun | Moin moin,
ich bin Umsteiger von Turbo-/Power-Basic mit gut 10-jährigem "Schaffensloch" und habe darum ein Problem (V.11 Vollversion)
Ich muß Variabele aus einer an sich sequenziellen Datei einlesen, die aber einige Zeilen enthält in denen mehrere Variabele mit Kommata getrennt vorkommen. Anzahl und Typ dieser Variabelen ist in diesen Zeilen immer gleich, Strings und Zahlen gemischt, Strings sind zusätzlich innerhalb "".
Beispiel: -------------------------------------------------------- 15840 1 13,13,6,20,11,12,15 550 595 600 385 390 1,81074,36626,"Herr",36526,"Unbekannt","Diagnose","€","Schlusstext, 2. Zeile" 3 --------------------------------------------------------
Die Strings können auch Sonderzeichen, Punkt und Kommata sowie <LF> und <CR> enthalten, aber keine "" innerhalb eines Stringtextes. Die Textlängen sind unbestimmt.
Mit meinen alten Basic-Varianten war das kein Problem (leider aber nicht Windows-fähig), aber in XProfan 11 habe ich dazu noch nichts funktionierendes entdeckt. Aber da es ja "geht nicht" nicht gibt, kann mir bestimmt jemand weiter helfen.
Vorab vielen Dank Gruß, Matthias |
|
|
| |
|
|
|
Christian Eichler | Was ich persönlich, als jemand der gerade auf C umsteig, in diesem Fall machen würde ist folgendes:
Ich würde jeden Buchstaben einzeln vergleichen und dabei die " mitzählen. Ist die Anzahl der " ungerade ist das , innerhalb der ", ist sie gerade handelt es sich tatsächlich um ein Trennkomma.
Das ist blos ne spontane Idee von mir gewesen.
BTW: Überprüfen, ob eine Zahl gerade ist oder nicht kann man wunderbar mit Modulo 2
Grüße Christian |
|
|
| Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6 | 08.12.2008 ▲ |
|
|
|
|
Frank Abbing | Sind die einzelnen Zeilen durch <CR> getrennt? Ist natürlich alles machbar, nur fehlen noch ein paar Infos. Wenn die Dateien nicht gerade gigantisch gross sind, würde ich sie in einen Bereich laden und dann parsen. |
|
|
| |
|
|
|
Matthias Badzun | Die Dateien können 300~400 kB groß sein, teoretisch auch größer aber in der Praxis eher nicht. Die Zeilen sind durch <CR><LF> getrennt. Aber inerhalb der Strings können ebenfalls <CR><LF> als Zeilenumbruch im Klartext vor kommen, die sich auch im EDITOR so darstellen. Die dürfen dann natürlich nicht als Ende der Datenzeile interpretiert werden. |
|
|
| |
|
|
|
Dietmar Horn | Hallo Matthias,
ich würde die Datei sequentiell einlesen und jede Zeile in einer Schleife mit SubStr$ durchforsten (mit Komma als Trennzeichen), bis nichts mehr kommt (siehe XProfan-Hilfe zu Substr$).
Die Strings erkennst Du dann ja an den Anführungszeichen, die Du mit Instr überprüfen kannst. Bei nur 300 bis 400 KB müßte das 1-2-fix gehen.
Da dürfte dann auch <CR><LF> innerhalb der Strings nicht stören.
Gruß Dietmar |
|
|
| Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V. [...] Windows 95 bis Windows 7 Profan² 6.6 bis XProfan X2 mit XPSE Das große XProfan-Lehrbuch: [...] | 08.12.2008 ▲ |
|
|
|
|
Frank Abbing | Ja, kommt <CR><LF> innerhalb von Anführungszeichen vor, befinden sie sich in im String. Ansonsten trennen sie die einzelnen Zeilen voneinander ab. Ich würde alles in einen Bereich lesen und zeichenorientiert parsen. |
|
|
| |
|
|
|
| Matthias Badzun
Ich muß Variabele aus einer an sich sequenziellen Datei einlesen, die aber einige Zeilen enthält in denen mehrere Variabele mit Kommata getrennt vorkommen. Anzahl und Typ dieser Variabelen ist in diesen Zeilen immer gleich, Strings und Zahlen gemischt, Strings sind zusätzlich innerhalb "". Die Strings können auch Sonderzeichen, Punkt und Kommata sowie <LF> und <CR> enthalten, aber keine "" innerhalb eines Stringtextes. Die Textlängen sind unbestimmt.
Würde ich per Array lösen.
Hab "einladen" und "getxy" auf obiges angepasst, dass das mit den Strings klappt. KompilierenMarkierenSeparieren {$cleq}
//globale
strings myData.strings,
myData=myData.loadFromString(fgc("meineDatei"))
//fenster
cls
//testen
print "Zeilen:",sizeOf(myData)
print "1,1:",myData.getxy(1,1)
print "3,3:",myData.getxy(3,3)
print "1,5:",myData.getxy(1,5)
print "3,9:",myData.getxy(3,9)
print "4,9:",myData.getxy(4,9)
print "6,9:",myData.getxy(6,9)
waitInput
end
myData.loadFromString(string data){
clear myData.strings
strings lns=explode(data,"q")
long c=sizeOf(lns)
case (c==0) : case (lns[0]=="") : return lns
data=""
whileLoop 0,c-1 {
ifnot (loop mod 2) {
data=data+lns[loop]
} else {
myData.strings[sizeOf(myData.strings)]=lns[loop]
data=data+"q"+str$(int(sizeOf(myData.strings)))+"q"
}
}
strings nData=explode(data,"
")
return nData
}
myData.getxy(long x,y){
y-
string s=substr$(myData$[y],x,",")
casenot mid$(s,1,1)=="q" : return s
long n=val(del$(s,1,1))
casenot n : return ""
return myData.strings[n-1]
}
fgc(string fle){
long fh=assign(fle)
casenot fh : return ""
reset #fh
string s,_out
whileNot eof(fh) {
input #fh,s
_out=_out+s
casenot eof(fh) : _out=_out+"
"
}
close fh
assign fh,""
return _out
}
bzw. KompilierenMarkierenSeparierenDECLARE MYDATA.STRINGS$[]
DECLARE MYDATA$[]
MYDATA$[]=MYDATA.LOADFROMSTRING(FGC("meineDatei"))
CLS
PRINT "Zeilen:",SIZEOF(MYDATA$[])
PRINT "1,1:",MYDATA.GETXY(1,1)
PRINT "3,3:",MYDATA.GETXY(3,3)
PRINT "1,5:",MYDATA.GETXY(1,5)
PRINT "3,9:",MYDATA.GETXY(3,9)
PRINT "4,9:",MYDATA.GETXY(4,9)
PRINT "6,9:",MYDATA.GETXY(6,9)
WAITINPUT
end
proc MYDATA.LOADFROMSTRING
PARAMETERS DATA$
DECLARE LNS$[]
CLEAR MYDATA.STRINGS$[]
LNS$[]=EXPLODE(DATA$,"q")
var C&=SIZEOF(LNS$[])
IF (C&=0)
IF (LNS$[0]="")
RETURN LNS$[]
ENDIF
ENDIF
DATA$=""
WHILELOOP 0,C&-1
IFNOT (&LOOP MOD 2)
DATA$=DATA$+LNS$[&LOOP]
ELSE
MYDATA.STRINGS$[SIZEOF(MYDATA.STRINGS$[])]=LNS$[&LOOP]
DATA$=DATA$+"q"+STR$(INT(SIZEOF(MYDATA.STRINGS$[])))+"q"
ENDIF
ENDWHILE
DECLARE NDATA$[]
NDATA$[]=EXPLODE(DATA$,"
")
RETURN NDATA$[]
endproc
proc MYDATA.GETXY
PARAMETERS X&,Y&
DEC Y&
var S$=SUBSTR$(MYDATA$[Y&],X&,",")
IFNOT MID$(S$,1,1)="q"
RETURN S$
ENDIF
var N&=VAL(DEL$(S$,1,1))
IFNOT N&
RETURN ""
ENDIF
RETURN MYDATA.STRINGS$[N&-1]
endproc
proc FGC
PARAMETERS FLE$
var FH&=ASSIGN(FLE$)
IFNOT FH&
RETURN ""
ENDIF
RESET #FH&
var S$=""
var _OUT$=""
WHILENOT EOF(FH&)
INPUT #FH&,S$
_OUT$=_OUT$+S$
IFNOT EOF(FH&)
_OUT$=_OUT$+"
"
ENDIF
ENDWHILE
CLOSE FH&
ASSIGN FH&,""
RETURN _OUT$
endproc
|
|
|
| |
|
|
|
Matthias Badzun | Vielen Dank euch allen für die verschiedenen Ideen. Soweit ich die mit meinem noch recht bescheidenen Xprofan-Kenntnissen nachvollziehen konnte hab ich sie ausprobiert. Da in den Textfeldern Kommata vorkommen geht substr$ nicht - das mach dann dort ein neues Feld auf und weiter hinten stehende werden dann nicht mehr gelesen. Also musste ich doch die Zeile zunächst komplett einlesen und dann Byte für Byte auspicken. Irgendwas hakt zwar noch manchmal beim Wieder-zusammenbau der Texte in einen neuen String, muß mit dem Feldinhalt zu tun haben, aber wenigstens hab ich schon mal alle meine Felder wieder in einzelnen Variabelen.
Frohe Festtage und guten Rutsch für alle
Matthias |
|
|
| |
|
|
|
| In meinem Posting (2 hoch) stehen zwei funktionierende (getestet) Lösungen, magst nicht?
(naja, schwer zu übersehen ists ja nicht da einziger Code hier im Thread *g*)
Auf Deutsch: Der Code zeigt doch wie es funzt und ist zudem sehr schnell. |
|
|
| |
|
|
|
Matthias Badzun | mögen tät ich die schon, aber da reicht mein profanes Xprofan-Wissen noch lange nicht aus um das zu verstehen. Wenn dann in der Praxis was aneckt hab ich keine Chance, die Ursachen zu entdecken. So ganz allmählich stoße ich hier auf die Equivalente zum Altgelernten. Aber ein paar Progrämmle muß ich mir wohl noch rausquälen um wieder fit zu werden. Trotzdem viele Dank für diese Scripte, sind auf der Platte, aber noch nicht im Hirn Bis bald, bis zum nächsten Schlauch, auf dem ich eine Weile ausharre |
|
|
| |
|
|
|
| You are welcome!
Wenn Fragen entstehen...
Aber vielleicht könnte ja ein Geübter obigen Code etwas humanisieren. |
|
|
| |
|
|