ich bin noch ein Newbie im Bereich Datenbanken, brauche diese aber zur Vervollständigung meiner Diplomarbeit. Was hierbei besonders interessant für mich ist, ist der Import von Daten aus einer Datei in eine Tabelle. Die Dateien sind selbst tabellenartig (bis zu 20 Spalten und 100000 Zeilen).
Soweit klappt das auch mit dem “Copy”-Befehl. Allerdings ist mir aufgefallen, daß dies nur der Fall ist, wenn die Einträge in den Spalten einer Zeile einen “Tab”-Abstand besitzen. Andernfalls kann PGSQL die Daten den einzelnen Spalten nicht zuweisen.
Deswegen meine Frage:
Besteht diese Problem überhaupt oder stelle ich mich nur dämlich an?
Wenn ersteres der Fall sein sollte, gibt es doch sicherlich ein Tool zur “Formatierung” der Dateien?!?
Bei letzterem: wie kann ich es besser machen?
Mein Befehl lautet ganz einfach:
copy … from ‘/…’;
Trenne ich die Einträge in der Datei nur mit einem Leerzeichen, dann kommt folgende Fehlermeldung:
eingebe, importiert er Daten, die innerhalb einer Zeile nur von einem Leerzeichen getrennt sind.
Dasselbe geht mit ‘\t’, wenn ein tab dazwischen ist. Aber ich schaff es nicht, wenn z.B. 3 Leerzeichen Abstand sind, weil DELIMITER ein SINGLE CHARACTER sein muß.
Jedes beliebige Eingabeformat ist vielleicht nicht möglich, aber kannst du die Daten nicht vorher etwas aufbereiten? Ein kleines sed oder awk Script sollten da gute Dienste tun.
Bestimmt auch mit C, aber sed oder awk geht bestimmt schneller. Was genau gefällt Dir an \t nicht?
Du kannst doch bestimmt auch ein Zeichen finden, das so nicht im text vorkommt, das PIPE-Zeichen z.B.
und das ist noch viel schlimmer, wie ich jetzt sehe, weil die Einträge auch noch unterschiedliche Abstände innerhalb einer Zeile haben
das kommt jetzt hier allerdings nicht rüber ^^
Naja. Erzeugst Du diese Datei per Hand oder automatisch?
Der TAB-Abstand ist Sache der Darstellung, im vim kann man das z.B. einstellen. Dann sieht das auch hybsch aus. Aber normalerweise sieht ‘Mensch’ das ja gar nicht erst.
achso, das hätte ich vielleicht dazu sagen sollen: die dateien werden nicht von mir erzeugt, das sind daten, die ich aus dem netz ziehen muß, d.h. ich habe keine kontrolle darüber, wie diese werte innerhalb der dateien angeordnet sind
Naja. Damit ist das aber eher ein organisatorisches oder sonstiges Problem und keines von PostgreSQL. Mich wundert allerdings, das bei “(bis zu 20 Spalten und 100000 Zeilen)” nicht einmal die Reihenfolge der Daten klar ist.
leider hast Du die Tabellendefinition nicht angegeben. Ich vermute mal, dass die Fehlermeldung “invalid input syntax” durch das dem ‘+’-Zeichen folgende Leerzeichen entsteht. Das ‘+’-Zeichen hört zur nachfolgenden Zahl und muß daher direkt vor der Zahl stehen, ansonsten wird es als Character interpretiert.
die daten haben natürlich eine ordnung, sonst wäre es ja sinnlos
nur kann ich sie nicht bestimmen, weil ich nicht mit den leuten zusammenarbeite, die sie erstellen und die dateien teilweise auch schon 10 jahre alt sind
hi fristo,
das + gehört nicht zur nachfolgenden zahl, es gehört zum “p”
“p” wiederum ist eine eigene spalte, in der nur characters bzw. text stehen soll
Wie Du siehst habe ich an bestimmten Stellen doppelte Leerzeichen eingeführt (auch am Ende einer Zeile), so dass in der Tabelle es Spalten mit keinem Wert gibt. Der Code wurde von mir getestet und funktioniert einwandfrei. Sollte Dir weiterhelfen.
danke für die mühe fristo
leider muß ich dazu was anmerken: das es bei dir geklappt hat, war nur zufall
du hast 11 Spalten definiert, aber es gibt in jeder Zeile nur 10 Zahlen, d.h. in deiner Tabelle müßten leere Felder auftauchen, oder?
diese entstehen, wenn du eben in einer Zeile mal nich nur 1 sondern 2 Leerzeichen Abstand zwischen den Zahlen hast
und das hast du für jede Zeile auch immer nur einmal gemacht, d.h. er lässt die eine Spalte dann frei (weil Leerzeichen) und trägt es in die nächste ein ^^
so sieht die tabelle bei mir aus bzw. so soll sie aussehen:
Im Gegensatz zu Dir bin ich kein Student der bei einem einfachen Problem hier im Forum auf Unterstützung hofft, sondern ein Profi, der sein Handwerk beherrscht und dessen Programme immer funktionieren und nicht zufällig. Must wohl noch eine Menge lernen, nicht nur was Datenbanken betrifft.
den Untschied zwischen Ursache und Wirkung solltest Du eigentlich kennen.
Hier ein nettes Beispiel von Dir: Für den Header der Tabelle gibtst Du folgende Informationen an:
v’ v" s’ s" J p" PQR wavenumbr A*HLF/(2J’+1) term values
Ich zähle da 11 Felder, die durch ein Leerzeichen getrennt sind, und nicht 10. Und die Headerinformationen in einer Tabelle sind immer maßgebend, da Sie die Spalten einer Tabelle angeben. Nicht nur weil der COPY-Befehl immer für jede Spalte einer Zeile Werte verlangst, sondern um Dir auch zu zeigen, dass man Felder ohne Werte importieren kann, habe ich an verschiedenen Stellen ein Leerzeichen eingefügt.
Solange in der Import-Datei pro Zeile immer 10 Werte eingetragen sind, sollte es kein Problem darstellen, überflüssige Leerzeichen mittels eines Tools zu entfehrnen. Die Datenaubreitung gehört beim Import von Daten in der Regel dazu. Danach wird es auch keine Problem mit " with delimiter as ‘’ " geben.