Probleme mit sqlite.exe bei größeren csv Dateien ("sqlite3.exe nicht gefunden")

  • Hallo Leute,

    ich wollte ein Programm schreiben, um mal schnell sehr große csv-Dateien verkleinern zu können, bei denen ich viele Spalten nicht brauche. Dann habe ich mich einen Tag für die GUI und Funktionen hingesetzt und am Ende beim ersten Test mit einer etwas größeren Datei festgestellt, dass das ganze Konstrukt von der Basis her schon nicht funktioniert.. :rolleyes:

    Folgendes Problem habe ich:

    Ich nutze die sqlite.exe und die ".import"-Funktion, um die csv einzulesen.

    Bei Dateien mit etwa 50 Spalten und 100 Zeilen geht es noch. Versuche ich aber eine Datei mit etwa 100x100 Feldern zu importieren, erscheint die Medung: "sqlite3.exe nicht gefunden".

    Im Anhang das Testskript und die benötigten sqlite-Skripte. Alle müssen in einem Verzeichnis liegen.

  • Moin, habe den selben Fehler. 5x50 gehen noch, aber danach wird es langsam kritisch.

    Vielleicht würde es gehen, wenn du einen Konverter erstellst, der deine großen CSV Dateien

    in kleinere aufteilt, sodass sie von der exe ausgelesen werden könne. :(

    Achja wofür eigentlich sqllite?

  • Hallo Leute,

    mittlerweile kann ich noch die Info geben, dass die Fehlermeldung von dieser Stelle in der SQLite.au3 kommt.

    Die Variable $nErrorLevel erhält den Wert 1 in der 5. Zeile Local $nErrorLevel = RunWait($sCmd, @WorkingDir, @SW_HIDE) und dieser Wert wird als Fehler zurückgegeben. Der Autor der UDF hat sich dazu entschieden, in diesem Fall den Fehlerwert 21 ($SQLITE_MISUSE) weiterzugeben. Warum weiß ich nicht.

    Laut https://sqlite.org/rescode.html (6. Result Code Meanings) meint 1 etwa "irgendein anderer Fehler". :rolleyes:

    Ich habe keine Ahnung wie ich das werten soll und hoffe, hier kann das jemand besser einordnen. Normalerweise sollte man noch viel größere Dateien importieren können (worum es mir auch eigentlich geht - daher die Datenbank-Variante).

    xSunLighTx3 Da habe ich noch an meinem Beitrag geschrieben, als du geantwortet hast. :)

    Als Notlösung würde ich so vorgehen, also die Dateien aufteilen. Aber sqlite könnte das sicher schneller erledigen. Daher hoffe ich noch auf eine Lösung. Warum sqlite? Ich habe auch Dateien, die ein Array sprengen können und nach dem Einlesen von sehr großen Dateien kommt noch das Bearbeiten. Ich denke das geht über die DB-Variante einfach schneller.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (12. März 2018 um 20:27)

  • Kann dein Archiv da zwar nicht runterladen, aber irgendwie versteh ich deinen CMD Aufruf nicht so ganz wenn ich mir die Doku der sqlite3.exe so anschaue.

    Demnach schaut die Nutzung der CSV Import Funktion eigentlich ganz anderst aus.


    https://sqlite.org/cli.html

    Zitat

    8. CSV Import

    Use the ".import" command to import CSV (comma separated value) data into an SQLite table. The ".import" command takes two arguments which are the name of the disk file from which CSV data is to be read and the name of the SQLite table into which the CSV data is to be inserted.

    Note that it is important to set the "mode" to "csv" before running the ".import" command. This is necessary to prevent the command-line shell from trying to interpret the input file text as some other format.

    Code
    sqlite> .mode csv
    sqlite> .import C:/work/somedata.csv tab1

    There are two cases to consider: (1) Table "tab1" does not previously exist and (2) table "tab1" does already exist.

    In the first case, when the table does not previously exist, the table is automatically created and the content of the first row of the input CSV file is used to determine the name of all the columns in the table. In other words, if the table does not previously exist, the first row of the CSV file is interpreted to be column names and the actual data starts on the second row of the CSV file.

    For the second case, when the table already exists, every row of the
    CSV file, including the first row, is assumed to be actual content. If
    the CSV file contains an initial row of column labels, that row will be
    read as data and inserted into the table. To avoid this, make sure that
    table does not previously exist.

    Um die interaktive CLI zu automatisieren kann man die CMDs in eine Textdatei schreiben und übergeben:

    Zitat

    Create a text file with the lines you want to enter into the sqlite command line program, like this:

    .mode csv

    .import C:/work/somedata.csv tab1

    and then just call sqlite3 database.db < commands.txt

  • Hallo misterspeed

    Ich glaube genau das, was du vorschlägst, siehst du in dem Quelltextschnippsel. Bei Nutzung der sqlite.au3 gibst du einen String an, wie du ihn beschreibst. Die UDF schreibt ihn in eine Textdatei und führt das dann aus.

    Du kannst dir das in der Funktion: "_SQLite_SQLiteExe" ansehen.

    Ich habe die inkludierten Dateien mal auf verschiedene au3-Dateien aufgeteilt und konnte sie nun im ersten Beitrag anhängen. Du kannst dir nun auch das Testskript einzeln laden und dir den an sqlite übergebenen String ansehen.

    Grüße autoiter

  • Hallo Leute,

    Mittlerweile habe ich mal Tests direkt mit der Konsole gemacht. Da wurde mir sofort so einiges klar, denn die Fehlerrückgabe der sqlite-UDF ist ja unterirdisch...

    Es war komplettes Eigenverschulden. :whistling:

    Erst einmal war meine Test-Funktion zum csv Erstellen ungeeignet.

    Hier wurde die erste Zeile generiert. Ein Zufallswert von 1 bis 1000 als Ganzzahl.

    AutoIt
    For $i = 1 To $iCols
        $s &= Random(1, 1000, 1) & ";"
    Next

    Je mehr Spalten, desto höher war hier die Wahrscheinlichkeit von Duplikaten in den Überschriften.. -> Fehlerabbruch.

    Das wird das Hauptproblem gewesen sein. Hinzu kommen dann aber die voreingestellten Limits, um die ich mich nicht gekümmert hatte. Max Variablen, Max Spalten, Max Statement-Länge usw...

    Sorry für diesen sinnlosen Thread.. X/

    Grüße autoiter