Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 20:32

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Okt 24, 2008 16:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo!

Habe seit einiges Jahren Pause mal wieder bissl angefangen mein Programm fertig zustellen.
Nun speicher ich Dateien und Frage mich, mit welchem "Zeichen" sollte ich den Text trennen.
Im moment sieht es so aus:

100,Ebene 1,-1
101,62,531,343,442,,8,0,-1,0,0,0,1,1,Label-Comp3\n2te\n3te zeile
101,209,342,452,262,Combobox-Comp1,4,0,-1,-1,3,-1-,-2-,,3,

Nunja, bin der Meinung das dies nicht so super ist. Gerade aus dem Grund, dass teilweise Texte selbst erstellt werden können.
Und wer verbietet dann ein komma zu setzen? Das will ich nicht verbieten und genauso nicht, dass man kein "\n" mehr schreiben darf...
Also was für Zeichen kann ich da nehmen?! :-/

Danke schonmal im Vorraus.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 24, 2008 19:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Muß es denn von einem user editierbar sein die datei?
Weil wenn nicht würde sich jedes ASCII zeichen > 127 anbieten.. oder gleich binär speichern :)

Oder direkt darüber nachdenken es als XML o.Ä. zu speichern.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 25, 2008 06:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Editierbar sind nur einzelne felder, also nicht unbedingt die datei ...
dann könnte ich die? #128 als zeichen nehmen oder was?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 25, 2008 07:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich würde im Gegenteil zu einem Zeichen unter #32 raten. (#32 ist das Leerzeichen). Alle Zeichen, die kleiner sind als #32 sind die "nicht druckbaren" Steuer-Zeichen. Für Textdateien hat man früher die Kombination #13 (=Zeilenvorschub) + #10 (=Wagenrücklauf) als Zeilenabschluss verwendet. Diese Bezeichnungen gehen auf die alten Zeilendrucker zurück, die sich an der Schreibmaschinentechnologie orientiert haben. Solche Dateien kann man mit jedem Texteditor öffnen.

Ein Pascal-Codeschnipsel:
Code:
  1. // Writes a line to a textfile considering [chr13=line forwarding]
  2. // and [chr10=carriage return]
  3. Procedure TStdLineProvider.WriteLine(ALine: T8bString);
  4. Var PCharLine: PChar; LChar: T8bChar;
  5. Begin
  6.    // delete separator at line end
  7.    SetLength(ALine, Length(ALine)-1);
  8.    PCharLine:= PChar(ALine); // Write is not suited for AnsiString
  9.    fFileStream.Write(PCharLine^,StrLen(PCharLine));
  10.    // EndOfLine = Chr13+Chr10
  11.    LChar:= Chr(13); fFileStream.Write(LChar, 1);
  12.    LChar:= Chr(10); fFileStream.Write(LChar, 1);
  13. End;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 25, 2008 13:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Mh, ja das ist mir schon klar, das ist ja im prinzip "ENTER" also neue zeile ...
Aber das will ich ja nicht... gibt es irgendwo sowas wie ne beschreibung zu den ganzen zeichen ...
will dann so ein nicht drückbares haben, das ist wohl das beste ... aber welches?
die #15 zB. oder wie?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 25, 2008 15:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

du kannst doch auch sowas wie Feldbeschränkungen einfügen (doofes wort, keine ahnung wie man das nennen soll ;) )

Also z.B. legst du fest, dass alles was zwischen zwei " " (Anführungszeichen) ein Feld ist, egal was da für Zeichen drin sind.
So können dann auch Texte in denen Kommata vorkommen in ein CSV Format eingefügt werden.

Evtl hilft dir auch das weiter
http://de.wikipedia.org/wiki/CSV_(Dateiformat)#Beispiel
schau dir da mal die letzte Zeile des Beispiels an

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 25, 2008 17:19 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Adler hat geschrieben:
gibt es irgendwo sowas wie ne beschreibung zu den ganzen zeichen ...

Ja, gibt es. Hier z.B. http://en.wikipedia.org/wiki/ASCII

Ansonsten ist das mit den Textdateien so, daß unter Windows der Zeilenvorschub die Kombination #0D#0A ist (CR und LF . Wie bei der mechanischen Schreibmaschiene.. Den Hebel berühren und den träger (carriage) nach links schieben , bis an den rand und dann den hebel durchdrücken, dannzieht die Maschiene eine Zeile hoch: Zeilenvorschub). Die meisten Unixe benutzen nur LF, also #0A und der Mac benutzt nur CR: #0D. Ansonsten war da oben galub irgendwo die nummern für CR und LF vertauscht :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 25, 2008 21:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Ansonsten war da oben galub irgendwo die nummern für CR und LF vertauscht

Ja, hast recht, sind vertauscht. Also, Richtigstellung: #10 = line feed, #13 = carriage return. Muss wohl schon ziemlich spätabends gewesen sein, als ich das gecoded habe.

Infos dazu über Google. Das Web wimmelt nur so von ASCII-Tabellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 25, 2008 23:12 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Am besten keine \r\n zum trennen der daten verwenden, da es recht schnell mal vorkommt, das ein editor diese verändert. Manchmal kommt XML recht gut in frage, zumal es auf später noch erlaubt ein XML framework zu verwenden.
Ansonsten haben sich die Anführungszeichen "" und \" für den fall das es innerhal dieser Zeichen stehen muss bewährt. Alternativ kann man auch zu einem Ascci Zeichen greifen, welches in den Daten verboten ist. Denkbare beispiele wären § # oder das Leerzeichen (besonders für Zahlenlisten)

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 26, 2008 00:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du bei einfachen Textdateien bleiben willst, empfehle ich dir das, was schon von einigen Vorgängern gesagt wurde, ich präzisiere:
Du trennst deine Zeilen erstmal ganz normal mit Zeilenumbruch.
Deine Felder trennst du durch Kommata, Textfelder kommen in Anführungszeichen.
Wenn in einem Text ein Anführungszeichen vorkommt, wird da ein \ (#92, Backslash) vorgesetzt.
Wenn in einem Text ein Zeilenumbruch vorkommt, so wird dieser durch \n ersetzt.
Wenn in einem Text ein \ vorkommt, so wird es durch \\ ersetzt.

Damit dürftest du ganz gut fahren und bist für alle Fälle gewappnet. Du musst halt nur beim Auslesen die umgewandelten Zeichen wieder zurückkonvertieren, damit der Benutzer da nicht sowas stehen hat wie: "Hallo,\n wie geht es Ihnen?"

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 26, 2008 10:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Also das mit den blöcken, also mit " ist ja ne gute idee, nur halt nicht für die zeilen umbrüche ... aber für die kommas ;-) danke schonmal dafür ...

und zu den Zeichen ... die gehen leider nur bis : 111 1110 176 126 7E ~
Nunja, was kommt danach, da kommen doch sicher einige zeichen die man nicht brauch, dann verbiete ich das eine einfach, aber nicht sowelche die man öfter mal benutzt... :-/ ich denk mal ich nehm diese hier:

Code:


Danke aber an alle ... super!


EDIT: oh die letzten 2 posts habe ich nicht gesehen ... ja daran habe ich nicht gedacht mit " \" \ \\ usw ... das ist eigtl. perfekt. danke allen nochmal ;-)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 23:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hey!

Nochmal super danke!

geparsed sieht das jetzt so aus:

Code:
  1. "100";"Ebene 1";"-1"
  2. "101";"101";"492";"415";"288";"";"8";"0";"-1";"0";"0";"0";"1";"1";"Label-Comp2\nhier \\n\nhier \"\nhier nix"


Werde wenn ich die unit bissl strukturiert habe, sie hier reinstellen, funktioniert aber supi, danke nochmal :-)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 29, 2008 09:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Halte ich nicht für so gut, die Idee.
Mit XML bist du definitiv auf der besseren Seite, da das Format erstmal Unicode Kompatibel ist, es schon ne menge guter Parser gibt und das Format einfach extrem Flexibel ist.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 29, 2008 12:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das mag zwar sein, dass das XML-Format all dies hat, aber man braucht es vielleicht nicht immer. Für so eine kleine Liste oder Datenbank wird das komplett angemessen sein.
Auch sind die meisten XML-Parser viel zu riesig, libxml2 zum beispiel, sich da einzuarbeiten, nur um mal schnell was kleines zu Programmieren, ist echt overhead. Auch kann man, wenn man z.B. mit Delphi programmiert, mit dem Unicode support häufig nicht so viel anfangen, weil Delphi nunmal weder UTF-8 noch UCS-2 wirklich beherrscht (ok, Delphi an sich vielleicht, aber die Komponenten kommen damit nicht wirklich klar).
Selbst wenn man Unicode bräuchte, dürfte das garnicht so schwer werden, mit nen paar Umwandlungsroutinen (gibts übrigens OpenSource bei FPC dabei) das auch in dieses 2D-Listenformat zu bringen.

XML ist meiner Meinung nach für so eine einfache 2D Liste auch vom Platz her und vom aufwand, sowas zu schreiben, viel zu übertrieben. Man muss häufig diese &entity;-Schreibweise verwenden, jeden Listeneintrag mit allen Tags ausstatten und so. Ich denke, für diese einfache Art der Liste mit nen paar Zahlen und vielleicht nem Dateipfad ist XML übertrieben.

Grundsätzlich ist XML natürlich toll, man kann eine Menge damit anstellen, vorallem, wenns um komplexe Baumdatenstrukturen geht. Zum beispiel für nen Techtree oder so, da ist XML durchaus lohnenswert, vorallem, wenn man dazu nen DTD macht und sich die ganzen Checks vom Parse abnehmen lässt.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 29, 2008 16:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Also ich hab zwar noch nichts verändert, aber trotzdem erstmal so hier rein ;-)

"salo" steht für save load, mir ist nichts anderes eingefallen ;-) evtl fällt euch was ein hehe...

nun, man kann dann erstmal weil es einfach nur an meine bedürfnisse angepasst ist und nichts momentan unnötiges drin steht auch nicht viel mach, ABER:
man kann ...
- saloparser erstellen (.create;)
- neue "linie" erzeigen (.NewLine;)
- neues "item" hinzufügen (.AddItem(inhalt: string);
kann man dann beliebig viele items in beliebig viele "linien" hinzufügen
- speichern (.Save(Filename: string);)

ODER

- saloparser erstellen (.create;)
- öffnen (.Load(filename: string);)
mit zB.
- Item [reihe 0 item 0] abrufen (string := saloparser.items[0,0];)

Reicht für mich ... :-)

Code:
  1. unit salo_parser;
  2.  
  3. interface
  4.  
  5. uses classes;
  6.  
  7. const
  8.   sep_const = ';'; //Darf nur ein Zeichen sein!
  9.   block_be  = '"'; //Darf nur ein Zeichen sein!
  10.   bs        = ''; //Darf nur ein Zeichen sein!
  11. type
  12.   TitemLine = array of string;
  13. type
  14.   Tsalopa = class(TObject)
  15.     constructor create();
  16.     procedure NewLine();
  17.     procedure AddItem(itemtext: string);
  18.     procedure Save(Filename: string);
  19.     function parse(toparse: string):string;
  20.  
  21.     procedure Load(Filename: string);
  22.     function reparseToArray(toparse: string):TitemLine;
  23.   public
  24.     Items: array of TitemLine;
  25.     count: integer;
  26.   end;
  27.  
  28. implementation
  29.  
  30. constructor Tsalopa.Create();
  31. begin
  32.   count := 0;
  33. end;
  34.  
  35. procedure Tsalopa.NewLine();
  36. begin
  37.   count := count + 1;
  38.   setlength(Items,count);
  39. end;
  40.  
  41. procedure Tsalopa.AddItem(itemtext: string);
  42. var
  43.   itemcountinline: integer;
  44. begin
  45.   itemcountinline:=high(items[count-1]);
  46.   setlength(Items[count-1],itemcountinline+2);
  47.   Items[count-1][itemcountinline+1] := itemtext;
  48. end;
  49.  
  50. procedure Tsalopa.Save(Filename: string);
  51. var
  52.   fsl: TStringlist;
  53.   pa_line: string;
  54.   i,m: integer;
  55.   sep: string;
  56. begin
  57.   fsl := TStringlist.Create;
  58.  
  59.   for i := 0 to count - 1 do
  60.   begin
  61.     pa_line := '';
  62.     sep := '';
  63.     for m := 0 to high(items[i]) do
  64.     begin
  65.       pa_line := pa_line + sep + block_be + parse(items[i][m]) + block_be;
  66.       sep := sep_const;
  67.     end;
  68.     fsl.Add(pa_line);
  69.   end;
  70.   fsl.SaveToFile(Filename);
  71.   fsl.free;
  72. end;
  73.  
  74. procedure Tsalopa.Load(Filename: string);
  75. var
  76.   fsl: TStringlist;
  77.   pa_line: string;
  78.   i,m: integer;
  79.   sep: string;
  80.   get: TitemLine;
  81. begin
  82.   fsl := TStringlist.Create;
  83.   fsl.LoadFromFile(Filename);
  84.  
  85.   for i := 0 to fsl.Count - 1 do
  86.   begin
  87.     get := reparseToArray(fsl.Strings[i]);
  88.     NewLine();
  89.     for m := 0 to high(get) do
  90.     begin
  91.       AddItem(get[m]);
  92.     end;
  93.   end;
  94.   fsl.free;
  95. end;
  96.  
  97. function Tsalopa.parse(toparse: string):string;
  98. var
  99.   i,l: integer;
  100.   parsed: string;
  101. begin
  102.   l := length(toparse);
  103.   i := 1;
  104.   while i <= l do
  105.   begin
  106.     if (toparse[i] = bs) or (toparse[i] = block_be) then
  107.     begin
  108.       parsed := parsed + bs;
  109.     end;
  110.     if i + 1 <= l then
  111.       if (toparse[i] + toparse[i+1]) = #13+#10 then
  112.       begin
  113.         parsed := parsed + '\n';
  114.         i := i + 2;
  115.       end;
  116.     if i + 1 <= l then
  117.       if (toparse[i] + toparse[i+1]) <> #13+#10 then
  118.         parsed := parsed + toparse[i];
  119.     if i = l then
  120.       parsed := parsed + toparse[i];
  121.  
  122.     i := i + 1;
  123.   end;
  124.  
  125.   result := parsed;
  126. end;
  127.  
  128. function Tsalopa.reparseToArray(toparse: string):TitemLine;
  129. var
  130.   i,l, x,y: integer;
  131.   parsed: string;
  132.   inBlock: boolean;
  133.   isBS: boolean;
  134.   isBSout: boolean;
  135. begin
  136.   setlength(result,1);
  137.   y := 0;
  138.   x := 0;
  139.   inBlock := false;
  140.   isBS := false;
  141.   l := length(toparse);
  142.  
  143.   for i := 1 to l do
  144.   begin
  145.     if isBS and isBSout then
  146.       isBSout := false
  147.     else if isBSout = false then
  148.       isBS := false;
  149.     //BLOCK ENDE DEKLARIEREN
  150.     if (toparse[i] = block_be) and (isBS = false) and (inBlock = true) then
  151.     begin
  152.       inBlock := false;
  153.       result[y-1] := parsed;
  154.       parsed := '';
  155.     end else
  156.     //BS IM BLOCK
  157.     if (toparse[i] = bs) and (inBlock = true) and (isBS = false) then
  158.     begin
  159.       isBS := true;
  160.       isBSout := true;
  161.     end else
  162.     //BLOCK ANFANG DEKLARIEREN
  163.     if (toparse[i] = block_be) and (isBS = false) and (inBlock = false) then
  164.     begin
  165.       inBlock := true;
  166.       y := y + 1;
  167.       setlength(result,y);
  168.     end else
  169.     //IM BLOCK    BS=FALSE
  170.     if (inblock = true) and (isBS = false) then
  171.     begin
  172.       parsed := parsed + toparse[i];
  173.     end else
  174.     //IM BLOCK    BS=TRUE
  175.     if (inblock = true) and (isBS = true) then
  176.     begin
  177.       if (toparse[i] = 'n') then
  178.       begin
  179.         parsed := parsed + #13 + #10;
  180.       end else
  181.       begin
  182.         parsed := parsed + toparse[i];
  183.       end;
  184.     end;
  185.   end;
  186.  
  187. end;
  188.  
  189. end.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 15 Queries | GZIP : On ]