Artikelliste auslesen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von miami, 29.12.2006.

  1. miami

    miami Grünschnabel

    Dabei seit:
    29.12.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Hallo an die Programmierer-Gemeinde,

    ich hoffe ich bin hier richtig.
    Ich hab ein Problem eine Artikelliste aufzulösen und getrennt zu speichern.
    Sieht also so aus:
    Bestehende Liste mit Daten in dem Format
    100000;Name;Beschreibung;usw... nächste Zeile
    100001;Name;Beschreibung;usw...
    vor dem ersten Semikolon sind Artikelnummern, danach der Herstellername welche sich unterscheiden können.
    Ich will nun den ersten Herstellernamen herausfinden, danach alle Zeilen die an der gleichen Position diesen Herstellernamen haben auslesen und in eine neue Datei speichern die diesen Herstellernamen tragen soll.
    Danach sollen in der Ursprungsdatei alle diese kopierten Zeilen gelöscht werden und deer Vorgang soll wiederholt werden.
    Soll also zum Schluss so aussehen das ich im besten Fall eine leere Ursprungsdatei habe und viel Dateien mit dem Herstellernamen und dem Inhalt der Artikel dieses Herstellers.

    Ich hoffe es kann mir jemand helfen. Bin absoluter Neuling auf diesem Gebiet.

    Im voraus schon mal Danke
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Quick and dirty:

    Code:
    IFS=';'; cat file | while read a b c; do echo $a >> $b; done; unset IFS
    
    Gruß, Xanti
     
  4. miami

    miami Grünschnabel

    Dabei seit:
    29.12.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Hallo Xanti,

    erstmal vielen Dank für die schnelle Antwort.
    Ich glaube ich hab mich falsch ausgedrückt bei meiner Beschreibng.
    Dein code liefert mir verschieden Dateien mit den Artikelnummern.
    Ich will jedoch den ganzen Zeileninhalt in neue Dateien schreiben.
    Als Beispiel:
    Muster der Ursprungsdatei:
    1Zeile
    1000001;Hersteller1;xyz;irgendetwas;stck
    2Zeile
    1000002;Hersteller2;xyz;irgendetwas;stck
    .
    .
    .
    .
    87Zeile
    1000087;Hersteller1;xyz;irgendetwas;stck

    es kann also vorkommen das der gleich Hersteller in verschiedenen Zeilen vorkommt.

    Muster neue Dateien:

    Datei1
    Dateiname=>Hersteller1.txt
    1000001;Hersteller1;xyz;irgendetwas;stck
    1000087;Hersteller1;xyz;irgendetwas;stck
    .
    .
    .

    Datei2
    Dateiname=>Hersteller2.txt
    1000002;Hersteller2;xyz;irgendetwas;stck
    .
    .
    .

    Ursprungsdatei zum Schluss leer zur Kontrolle

    Gruß miami
     
  5. #4 Jabo, 29.12.2006
    Zuletzt bearbeitet: 29.12.2006
    Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    in Perl

    Hallo,

    das mit dem Zeilen löschen verstehe ich noch nicht so ganz, denn wenn man fertig ist, kann man doch die Datei weg hauen?

    Meine Version, in Perl:
    Code:
    #!/usr/bin/perl
    $file = "liste.txt";
    open(TABLE, "<$file") || die "$file not found!";
    @lines_array = <TABLE>;
    for(@lines_array){
        $line= "$_";
        @rows_split = split(/;/, $_);
        foreach($rows_split[1]){
     	open(NEW_TABLE, "[color=red]>>[/color]$_.txt");
    	print NEW_TABLE $line;
        }
    }
    
    Ausgehend davon, daß hinter dem 1. Semikolon immer der Herstellername steht, und bei folgender Liste:
    hast du hinterher:
    und:
     
  6. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Ok, hab das dann falsch verstanden. Kleine Änderung:

    Code:
    IFS=';'; cat file | while read a b c; do echo "$a;$b;$c" >> "$b"; done; unset IFS
     
  7. #6 miami, 29.12.2006
    Zuletzt bearbeitet: 29.12.2006
    miami

    miami Grünschnabel

    Dabei seit:
    29.12.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Hallo Jens,

    hab Dein Script mal gerade ausprobiert nd bekomme zwar dateien der verschiedenen Hersteller jedoch steht in jeder Datei nur eine Zeile,
    muss jetzt mal überprüfen ob das immeer die erste Zeile ist in der der Hersteller vorkommt.

    PS. Mit dem löschen hast Du recht. Die Datei kann eigentlich weg, war hlat nur zur Kontrolle gedacht ob alle Zeilen asgelesen werden.

    Gruß miami
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Hallo Jens,

    hab das jetzt mal überprüft, die Zeile in den Dateien ist die zuletzt vorkommende Zeile in der Ursprungsdatei.

    Gruß miami
     
  8. #7 Jabo, 29.12.2006
    Zuletzt bearbeitet: 29.12.2006
    Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    letzte Zeile

    Wenn die Liste nicht mit Zeilenumbruch endet, fehlt bei mir die letzte Zeile bzw. die Datei zur letzten Zeile....

    Sowas ist natürlich 3x eleganter als ein Perl-Script, aber ich denke bei sowas immer gleich in Arrays... :O
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Da warst du schneller als ich mit dem Verbessern! Schaue mal auf die rot markierten ">>".... mit einfachem ">" wird immer die Datei mit dem jeweils aktuellen Wert überschrieben, aber mit ">>" immer angehängt.
     
  9. #8 miami, 29.12.2006
    Zuletzt bearbeitet: 29.12.2006
    miami

    miami Grünschnabel

    Dabei seit:
    29.12.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Ja das hab ich auch gerade gesehen und ausprobiert.
    Die Dateien werden jetzt geschrieben das ist schon mal super, mir ist nur aufgefallen das alle Umlaute weggelassen werden und die erste und letzte Zeile die gleichen sind.

    Gruß miami
     
  10. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    @Jabo: Naja, elegant ist meine Lösung bei Weitem nicht, eben quick and dirty. ;)

    @miami: Füge

    Code:
    use utf8;
    
    direkt unter der shebang (#!/usr/bin/perl) ein.
     
  11. Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    Hallo,

    also das passiert bei mir nicht! Ich nutze lokal utf8 nicht, deshalb hatte ich das Problem mit den Umlauten nicht, aber doppelte Zeilen? Deshalb hatte ich in meinem Beispiel hinten "Testn" stehen und "n" fortlaufend nummeriert. Ich hatte beim Test keine doppelten Nummern / Zeilen....

    Das Script checkt aber auch nicht, ob im Array was doppelt ist, das kann man natürlich auch.
     
  12. miami

    miami Grünschnabel

    Dabei seit:
    29.12.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Sorry war mein Fehler, hätte die zuerst erzeugten Dateien löschen müssen.
    So wurden die Dateien nur geöffnet und alles an die zuerst erzeugte Zeile vom ersten Probelauf angehängt.
    Hab jetzt alle Dateien mal gelöscht und nochmal probiert dann klappts, nur der Fehler mit den Umlauten besteht noch, obwohl ich "use utf8;" eingefügt habe.

    Gruß miami
     
  13. Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    Ah, ok.... aber wenn man das öfter macht, könnte noch eine Zeile rein, die jede Datei immer leer anlegt, bevor die Schleife dann was dranhängt. Dran hängen muß die Schleife halt, sonst s.u. ...

    Wie sind sie denn im Original kodiert? Sonst fällt mir im Moment nix ein. Wenn man einfach das macht:
    Code:
    #!/usr/bin/perl
    $file = "liste.txt";
    open(TABLE, "<$file") || die "$file not found!";
    @lines_array = <TABLE>;
    for(@lines_array){
        print $_;
    }
    
    wie werden sie von Perl denn dann ausgegeben? In "$_" steht immer eine Zeile in dem Moment, wie sie geschrieben werden würde, die muß ja dann schon kaputt sein?!?

    Außerdem fällt mir gerade auf, daß ich die geöffneten Dateien nicht schließe, aber das Script endet ja, bevor das stört ... :O
     
  14. miami

    miami Grünschnabel

    Dabei seit:
    29.12.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Hab das Script mal getetstet, dann werden die Umlaute auch nicht ausgegeben.
    Hab das Problem jetzt aber gefunden.
    Gar nicht so einfach durch mehrere 100000 Artikel zu scrollen.
    Die Umlaute sind in der Datei schon garnicht drin. Wahrscheinlich ist da beim Grosshändler beim auslesen schon was schiefgegangen.
    Zu dem Vorschlag mit der leeren Zeile.
    Das ist eigentlich nicht nötig da die Dateien nachdem sie dann einzeln eingelsen wurden sowieso gelöscht werden.
    Der Vorgang wird immer nur mit einer neuen Ursprungsdatei gestartet,
    danach die einzelnen Dateien eingelesen und dann gelöscht.
    Scheint also so zu funktionieren.
    Also vielen, vielen Dank Ihr habt mir sehr geholfen.
    Ich hoffe ich hab nicht zuviel genervt

    Gruß miami
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. miami

    miami Grünschnabel

    Dabei seit:
    29.12.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Ich muss mich nochmal melden.
    Beim durchsehen der erstellten Textdateien hab ich festgestellt dass der Herstellername der abgefragt wird scheinbar nicht in allen Datensätzen gr0ss geschrieben ist und daher werden dann auch unterschiedliche Textdateien angelegt. 1mal gross geschrieben und einmal klein.
    Gibt es eine Möglichkeit zuerst alle Herstellernamen in Grossbuchstaben umzuwandeln und dann erst die Dateien zu erzeugen.

    Gruß;
    miami
     
  17. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Soll der Name nur im Filenamen grossgeschrieben werden:

    Code:
    #!/usr/bin/perl -w                                                                                                                                                                                                 
    $file = "liste.txt";
    open(TABLE, "<$file") || die "$file not found!";
    @lines_array = <TABLE>;
    for(@lines_array) {
       $line = $_;
       @rows_split = split(/;/, $line);
       $rows_split[1] =~ tr/[a-z]/[A-Z]/;                                                                                                                                                                              
       foreach($rows_split[1]) {
          open(NEW_TABLE, ">>$_.txt");
          print NEW_TABLE $line;
       }
    }
    
    
    oder auch in der Zeile:

    Code:
    #!/usr/bin/perl -w                                                                                                                                                                                                 
    $file = "liste.txt";
    open(TABLE, "<$file") || die "$file not found!";
    @lines_array = <TABLE>;
    for(@lines_array) {
       $line = $_;
       $line =~ s/(;[^;]*?;)/uc $1/e;                                                                                                                                                                                  
       @rows_split = split(/;/, $line);
       foreach($rows_split[1]) {
          open(NEW_TABLE, ">>$_.txt");
          print NEW_TABLE $line;
       }
    }
    
     
Thema:

Artikelliste auslesen

Die Seite wird geladen...

Artikelliste auslesen - Ähnliche Themen

  1. 2 Zeilen aus einer txt auslesen

    2 Zeilen aus einer txt auslesen: Hallo Leute, ich habe eine Datei die immer aus zwei zusammenhängenden Zeilen besteht, als Beispiel: DE0006231004 # 15,04 Infineon DE0005785604...
  2. Teil einer Variablen auslesen und in neue Variable schreiben

    Teil einer Variablen auslesen und in neue Variable schreiben: Hallo, ist für Euch bestimmt ganz einfach, aber trotz googlen komme ich nicht auf eine Lösung. In Variable x habe ich stehen: xy,ab Nun möchte...
  3. Datei auslesen und fund per MAil versenden.

    Datei auslesen und fund per MAil versenden.: Hallo folgendes Script habe ich zur Zeit in Arbeit. Und zwar führe ich über "at" ein kleines Script aus was in einem Logfile nach bestimmten...
  4. Dateien auslesen und Daten systematisch angeordnet in Datei ausgeben

    Dateien auslesen und Daten systematisch angeordnet in Datei ausgeben: Guten Abend, ich hätte da mal eine Frage. Bin mir recht sicher, dass es in der Shell funktionieren sollte, aber kenne mich damit kaum aus....
  5. ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

    ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern: Hallo Leute, heute brauche ich mal einen dringenden Rat von Euch. Ich habe hier etwas mehr als 1200 PDF-Dateien (Text), die jeweils ein...