Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi,

ich habe ein unglaubliches Phänomen entdeckt und habe nun absolut keine Ahnung wie ich dieses Problem lösen könnte. Hoffe einer von euch hat eine Idee. zumindest find ic es sehr interessant, da mir sowas noch nicht begegnet ist.

Ich habe ein bash-script geschrieben. diese script läuft auf einer Suse Linux 8.2 kiste und erstellt eine datei namens "liste". in folgender Form:

erste Zeile: id;pName;pBegin;pEnd;pInts;pThemen;pAutor;pSample;pOrt

die anderen zeilen sind sozusagen einträge also Daten. ich will quasi eine csv-Datei bilden. dann habe ich eine CGI-Script, wo ich über Sql Befehle mir einzelne Daten anzeigen lasse.

Natürlich funktioniert das nicht und es liegt an der Datei "liste". Ich habe dann die Datei auf nen windows recher gespielt und per excel aufgerufen und da als csv-Datei gespeichert. diese habe ich wieder auf die Linuxkiste gespielt und schon funktionierte meine sql-Abfragen ohne probleme. dann habe ich die neue und alte Datei mit hilfe von "diff" verglichen.

csv-Datei: < NULL;ikeaueb;;;0;;;;Uebungsverzeichniss

Textdatei: > NULL;ikeaueb;;;0;;;;Uebungsverzeichniss

das problem liegt also an der Dateidefinition die scheinbar hier über dieses "<" gesteuert wird. das wird natürlich in Editoren nicht als Textinhalt angezeigt so das man da nix ändern kann.

wenn ich an die csv-datei Daten anhänge, und dann mit der ursprünglichen csv-Datei vergleiche, ist das ergebnis genau das gleiche. der neue Eintrag wird bei "diff" wieder mit ">" angezeigt.

nun möchte ich nicht immer erst meine datei "liste" auf den windows rechner hauen um dann die als csv-Datei abzuspeichern, soll ja schließlich alles üebr ein script laufen.

hat da einer eine idee wie ich über ein script eine csv-Datei bilden kann?

mfg bosi

Geschrieben

Kannst Du mal zwei Beispiel-CSV-Dateien anhängen, funktionierend und nichtfunktionierend?

Und bitte auch die Code-Stelle posten, in der die Datei im CGI-Script eingelesen wird...

Geschrieben

Ich bin mir jetzt nicht ganz sicher, ob ich dich richtig verstehe. Aber du kannst mich gerne berichtigen.

Das "<" und das ">" sind ausgaben von diff. "<" zeigt dir den "alten" Inhalt und ">" zeigt dir was daraus wurde.

Villeicht liegt es ja auch dem Zeilenumbruch. Dazu wäre eine genauere Fehlerbeschreibung und/ oder die Codestelle deines CGIs notwendig.

Geschrieben

habe nochmal geforscht und stimmt das > und < kennzeichnen nur den Inhalt.

habe es mit file und dann die csv-datei und die textdatei versucht, und da steht bei der csv-datei:

such1.csv: ASCII text, with CRLF line terminators

tja nur ist weiterhin die frage wie ich meine textdatei soweit umwandle damit i damit ich das lesen kann...

mein Aufruf in dem CGI skript ist analog zur normalen datenabruf einer csv-datei:

my $DB_DSN="DBI:CSV:f_dir=/pfad/data;csv_sep_char=\\;";

my $dbh = DBI->connect($DB_DSN) || die "CONNECT::$!";

my $sql = "SELECT * \nFROM liste \n$SString";

my $sth = $dbh->prepare($sql) || die $dbh->errstr();

$sth->execute() || die "EXECUTE::$!";

my $d = $sth->fetchall_arrayref();

$sth->finish;

$dbh->disconnect();

Geschrieben

hat da einer eine idee wie ich über ein script eine csv-Datei bilden kann?

CSV = Comma Separated Value. Das heisst, eine Darstellung von Daten in dem einzelne Felder durch Kommata getrennt sind. Die erste Zeile ist dabei in der Regel die Spaltenüberschrift.

Auf http://www.wotsit.org/ kannst du mal nach cvs suchen, da findest du dann eine Beschreibung des Formats.

Aber ansich ist es wie gerade geschrieben: Eine Zeile je Datensatz, Felder durch Kommata getrennt. Dass Excel da Semikolon reinmacht, ist wieder eine MS-Spezialität ;)

Also eine CSV-Datei hat keinen besonderen Header oder so. Wahrscheinlich hast du Probleme, wegen Leerzeichen o.ä.. In dem Fall muss der Feldinhalt mit "" umschlosen werden.

Geschrieben

naja das witzige ist, das der inhalt gleich ist bei beiden Dateien. Also ob ich ; oder , benutze als Trennungszeichen ist egal.

wie gesagt der inhalt beider dateien also der csv-datei und der textdatei ist identisch. also kanns ja nicht an eventuellen leerzeichen liegen sondern eigentlich nur an der dateidefinition oder sehe ich das falsch?

Geschrieben
sondern eigentlich nur an der dateidefinition oder sehe ich das falsch?

Welche Dateidefinition? csv ist ein reines Textformat. Also eine reine Textdatei, ohne zusätzlichen Header o.ä.

Komma oder Semikolon ist egal, weil du ja bei deiner Abfrage das Trennzeichen mit angibst. Meinte das auch nur allgemein.

Geschrieben

mmh naja wie gesagt ich kenne mi da leider noch nicht so aus.

Aber wenn beide nur reine textdateien sind und deren Inhalt völlig gleich ist, warum geht das dann nicht wenn i die Texdatei aufrufe bzw da per sql abfrage?

Oder mache ich da irgendwas falsch beim CGI-Skript?

Geschrieben

Aber wenn beide nur reine textdateien sind und deren Inhalt völlig gleich ist, warum geht das dann nicht wenn i die Texdatei aufrufe bzw da per sql abfrage?

Bist du sicher, dass sie völlig gleich sind? Wenn das so ist, dprfte es ja keinen Unterschied geben. Wie sieht denn der Fehler aus bzw. was für eine Meldung bringt er denn?

Was für einen Zeilenumbruch fügst du in deinem Skript in die Datei ein? Windows hat immer \r\n als Umbruch (Linux nur \n), hast du es so mal probiert?

(\n = Linefeed, \r = carriage return)

Geschrieben

oh sorry hatte ich ganz vergessen.

also das ist die textdatei:

id;pName;pBegin;pEnd;pInts;pThemen;pAutor;pSample;pOrt

NULL;Test1;Tue_Feb_22_2005;Mon_Mar_21_2005;411;;;;Projektverzeichniss

NULL;Test2;Tue_Jul_19_2005;Tue_Jul_19_2005;1;;;;Projektverzeichniss

NULL;Test3;Thu_Jul_21_2005;Thu_Jul_21_2005;1;Mar 2005;SBO/BMI;1000;Projektverzeichniss

das ist die csv-Datei:

id;pName;pBegin;pEnd;pInts;pThemen;pAutor;pSample;pOrt

NULL;Test1;Tue_Feb_22_2005;Mon_Mar_21_2005;411;;;;Projektverzeichniss

NULL;Test2;Tue_Jul_19_2005;Tue_Jul_19_2005;1;;;;Projektverzeichniss

NULL;Test3;Thu_Jul_21_2005;Thu_Jul_21_2005;1;Mar 2005;SBO/BMI;1000;Projektverzeichniss

also ich habe schonmal geschaut ob es zusätzliche leerzeichen oder umbrüche oder sowas gibt aber auch da habe ich nichts gefunden.

wie gesagt das einzigste ist dieser unterschied bei dem befehl file, glaub ich zumindest bisher.

Geschrieben

Nein also wenn ich das script ausführe kommt im Browser keine Fehlermeldung.

Zeigt nur an das er quasi mit der sql-abfrage nichts finden konnte. mehr nicht.

wie gesagt stehe noch am anfang der CGI und Perl programmierung. gibts hier irgend nen befehl wie z.b. unter bash, wo man nen ablauf des programms in eienr datei speichern kann? oder andere nützliche befehle um vielleicht Fehlermeldungen zu erkennen?

Geschrieben

Auch schon versucht. findet so auch keinen einzigen Eintrag. also habe schonmal im ganzen script geschaut aber keinen fehler erkennen können. Die SQL Abfrage war auch immer in Ordnung. kann meiner Ansicht nur an der Datei liegen und diese sind ja gleich außer das halt dieser blöde unterschied bei dem befehl file auftritt, also das die eine datei irgendwie anders is aber halt ni vom inhalt.

hast du noch irgendeine idee was man da machen könnte?

Geschrieben

Komisch, denn die Beispieldateien unterscheiden sich ja inhaltsmäßig schon...

@Bosi: Sind das wirklich die Dateien, mit denen Du die Probleme hattest, d.h. von denen eine funktionierte, und die andere nicht?

Geschrieben

Ich sehe grade das i bei der csv datei die falsche geschickt hatte. das war zum probieren. hier noch mal die richtigen aber wirst sehen es sind nun beide vom inhalt gleich und es geht trotzdem nur die eine datei.

Data.zip

Geschrieben

Habe nen tip bekommen. bei der funktionierenden csv-datei, die per excel entworfen wurde steht bei eingabe von cat-v datei an jedem zeilenende ^M.

enstehen dadurch, das unix und windows unterschiedliche zeilendendefinitionen haben.

mmh muß i da sehen das ich in ne unixdatei diese ^M reinbekomme?

Geschrieben

gut hat sich erledigt. funzt nun endlich. habe einfach das komische ^M Zeichen in meine unixdatei an jedem Zeilende angehängt und nun klappts endlich problemlos.

Danke nochmal für eure Tipps und hilfen....

mfg bosi

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...