Datentypen CSV to DB Leere Zellen in CSV mit Inhalt?

JAMarlonVA

Mitglied
Hallo zusammen,

mein Problem ist folgendes:

Ich speichere eine Excel Tabelle als CSV (UTF - 8 Trennzeichen).

Soll eine Sprachdatenbank werden. Also mit Kanji-Zeichen etc..

Beim Anlegen meiner DB habe ich mit der Matrix-Formel "{=MAX(LÄNGE(Spalte:Spalte))}" zunächst einmal die größten Einträge der jeweiligen Spalten ermittelt.

Ich lege beim Import eine Spalte mit Guids an und "update" diese Einträge dann Spalte für Spalte. Nun habe ich das Problem, dass eine Spalte (größter Eintrag acht Zeichen lang, laut Formel) mir diesen Fehler zurück gibt "com.microsoft.sqlserver.jdbc.SQLServerException: Zeichenfolgen- oder Binärdaten würden abgeschnitten".

Ich Trage die Werte, der Spalte, in ein "nvarchar(20)" DB Feld ein. Das sollte theoretisch passen.

Wenn ich die DB in dieser Spalte nach NULL - Einträgen filtere und die IDs der Einträge dann in meiner CSV suche, finde ich jedes mal eine Leere Zelle vor (von der Spalte an der scheitere).

Hat jemand eine Idee wie das zu Stande kommen kann?

PS: Die Tabelle ist ziemlich groß und ich bekomme manchmal einen Arbeitsspeicher-Fehler wenn ich die Matrixformel auf zu große Spalten anwende.
 
Gott war ich verzweifelt.

Der Fehler lag an einem Invaliden CSV (Zeilenumbrüche in Zellen).

Lösung für mich war:

Makro in Excel schreiben was mir Semikolons und Zeilenumbrüche in "#ZU#", "#SM#" umwandelt und diese dannbeim Import wieder in Umbrüche umwandelt.

Man hätte auch ein Marko schreiben können, welches Zeichen wie diese Escapet aber für mich war diese Lösung komfortabler.
 
Nur wenn man dieses nicht als Trennzeichen verwendet oder eben Escaped mit Anführungszeichen.
Und letzteres macht jedes übliche Programm (zumindest hab ich bisher noch nichts gegenteiliges gesehen) 😉
War das bei deiner Ursprungs-CSV nicht der Fall? Dann würde ich das mal als Bug melden. Excel zB macht das automatisch beim Speichern, eine invalide CSV-Datei hab ich da bisher noch nicht rausbekommen.

Ich habe den Rekorder benutzt und den daraus entstandenen Code angepasst
Was ist der "Rekorder"?
 
Und letzteres macht jedes übliche Programm (zumindest hab ich bisher noch nichts gegenteiliges gesehen) 😉
War das bei deiner Ursprungs-CSV nicht der Fall? Dann würde ich das mal als Bug melden. Excel zB macht das automatisch beim Speichern, eine invalide CSV-Datei hab ich da bisher noch nicht rausbekommen.

So sah das vorher aus (Sieht mir falsch aus für eine 216 Spaltigen Tabelle):12170

Nachdem ich das Alles umgewandelt habe, wurde sie richtig abgebildet.

Was ist der "Rekorder"?

Man hat die Möglichkeit in Excel ein Makro aufzunehmen. Sprich man startet den Rekorder und Excel erstellt ein Makro aus den Funktionen, die man ausführt.

Dieses Makro habe ich dann nur noch anpassen müssen.
 
So sah das vorher aus (Sieht mir falsch aus für eine 216 Spaltigen Tabelle):
Ne, für eine wirklich 216 spaltigen Tabelle (WTF?) sieht das vollkommen richtig aus 🙂

Man hat die Möglichkeit in Excel ein Makro aufzunehmen. Sprich man startet den Rekorder und Excel erstellt ein Makro aus den Funktionen, die man ausführt.

Dieses Makro habe ich dann nur noch anpassen müssen.
Aber aus dem Excel-Makro erstellst du doch nicht den Java-Code zum Einlesen der CSV-Datei? 😵
 
Ne, für eine wirklich 216 spaltigen Tabelle (WTF?) sieht das vollkommen richtig aus 🙂

Spaltige mein ich natürlich.
in wie fern soll das richtig sein?😀

Aber aus dem Excel-Makro erstellst du doch nicht den Java-Code zum Einlesen der CSV-Datei? 😵

Achso.. Das ist jetzt auch schon etwas her. Bin auf den Beitrag nur nochmal eingegangen, um meine Lösung nochmal mit zu teilen.
Nun ja.. 😀 ich hab mir was eigenes gebastelt.
Aber das wurde nie angepasst.. Ich habe das mittlerweile als WebApp umgesetzt.

Php hat aber die gleichen Fehler gebracht, wenn ich die Zeichen nicht ersetzt habe.

Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class cCSV {
   
    String data[][];
   
    String csvFile = null;
    BufferedReader br = null;
    String csvSplitBy = null;
   
    int dimensionR = 0;
    int dimensionC = 0;
   
    public void open(String csv, String trennzeichen)   
    {
        csvFile = csv;
        csvSplitBy = trennzeichen;
       
        dimensionR = 0;
        dimensionC = 0;
        try
        {
           br = new BufferedReader(new FileReader(csvFile)); 
           br.mark(100000000);
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
            System.out.println("CSV zu groß");
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

    }
   
    public void getData()
    {  
        try
        {
            data = new String[dimensionR][dimensionC];         
            br.reset();
            for(int i = 0; i < dimensionR; i++)
            {
                data[i] = br.readLine().split(csvSplitBy, -1);
            } 
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }    
    }
    public void getDimensions()
    {
        try {
            dimensionC = br.readLine().split(csvSplitBy).length;
            br.reset();
            while (br.readLine() != null)
            {
                dimensionR++;               
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    public void close()
    {
        data = null;

        csvFile = null;
        br = null;
        csvSplitBy = null;
    }
}

PS: Ich weiß, dass man da einige Sachen besser machen könnte 😀
 
Zuletzt bearbeitet:
Spaltige mein ich natürlich.
in wie fern soll das richtig sein?😀
Na in dem Bild sieht man nur eine sehr lange logische CSV-Zeile, obs wirklich 216 sind hab ich natürlich nicht nachgezählt, den Beginn sieht man ja auch nicht.
Aber alle Zeilenumbrüche darin sind passend mit Anführungszeichen umgeben, jeder CSV-Parser sollte das passend einlesen können - Excel zB konnten das ja bei dir auch.


Dein eigener Parser ist halt nicht CSV-konform, zB ignoriert er ja generell als Anführungszeichen. Falls du in PHP genauso parst, ist klar, woher der Fehler kommt - aber auch in PHP sollte man vernünftige Parser finden können.
 
Dein eigener Parser ist halt nicht CSV-konform, zB ignoriert er ja generell als Anführungszeichen. Falls du in PHP genauso parst, ist klar, woher der Fehler kommt - aber auch in PHP sollte man vernünftige Parser finden können.

Dass mein eigener Parser das nicht kann, ist mir klar. Als ich das damals geschrieben habe, waren mir CSVs auch komplett neu.
Allerdings wundert es mich, dass die CSV Korrekt ist.. Eigentlich benutze ich von Php eine Funktion die das Parsen übernimmt .
Ich habe nahezu die gleichen Fehler gehabt, als ich die unveränderte CSV importiert hatte. Es hat zwar keinen Fehler aufgrund der Maximierung der DB Felder gegeben, allerdings sind viele Zellen leer gewesen, in denen eigentlich Inhalt sein sollte.
PHP:
 while (($data = fgetcsv($handle,100000, ";")) !== FALSE)
 

Zurück
Oben