SQL TO CSV

gr33nhat

Mitglied
Hallo alle zusammen,
erst einmal einen schönen Abend. Ich sitz gerade an einem Versuch aus einer ACCESS DB eine bestimmte Tabelle auszulesen und in eine CSV Datei umzuwandeln.

Das ist der Code:

Java:
package logic;

import java.io.File;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import com.opencsv.CSVWriter;


public class AccessToCSV {

static final String JDBC_DRIVER = "net.ucanaccess.jdbc.UcanaccessDriver";
static final String DB_URL = "jdbc:ucanaccess://Sicherung.mdb";
static final String USER = "";
static final String PASS = "";
static final Scanner in = new Scanner(System.in);



public AccessToCSV() throws SQLException {
}


public static void connectToDatabase()
{
try{
System.out.println("Connection Successfull");
System.out.println("----------------------------------------------");
}
catch(Exception e)
{

}
}
public static void getDatabase()
{
try {
Class.forName(JDBC_DRIVER);
Statement stmt = null;
Connection con = DriverManager.getConnection(DB_URL);

stmt = con.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_READ_ONLY);



String sql = "Select Artikel_ID, Artikelbeschreibung,Lagerbestand,AnsInternet FROM Artikel";

ResultSet rs = stmt.executeQuery(sql);

CSVWriter writer = new CSVWriter(new FileWriter(new File("Output.csv")), ';');
writer.writeAll(rs, true);
writer.close();


}catch (Exception e){
    System.out.println("Error" +e);
}
}}

Nun habe ich zwei Probleme:

1. In der Spalte Lagerbestand bekomme ich Ergebnisse im CSV mit 2.00000000000000000000 hier hätte ich jedoch gerne eine 2 stehen.

2. Die erstellte CSV hat das Problem, wenn ich es in Excel öffnen bekomme ich Codierungsfehler z.B. das Durchschnittszeichen wir nicht richtig dargestellt.

Wäre schön, wenn mir hier jemand helfen könnte. Bin gerade ziemlich am verzweifeln. :(

Euch allen einen gute Nacht.

Liebe Grüße
 

ARadauer

Top Contributor
wegen dem encoding... gibt mal irgendwo... das encoding "UTF-8" mit...
zb
CSVWriter writer =newCSVWriter(newOutputStreamWriter(
newFileOutputStream(fileName),"UTF-8"), ';','\'');

wegen der langen zahl, kommt da ein string oder eine zahl von der datenbank zurück?
 

gr33nhat

Mitglied
Vielen Dank für deine Antwort.
Das mit dem UTF-8 habe ich schon versucht. Leider ohne Erfolg. Das witzige daran ist ja, wenn ich es alls Vorschau anzeige (Mac) wird es mir richtig angezeigt auch via Texteditor. Lediglich Excel macht Probleme. Wenn ich das erstellte CSV in Notepad++ öffne und in UTF-8 codiere speichere und mit Excel öffne ist die Darstellung richtig.
Java:
CSVWriter writer =new CSVWriter(new OutputStreamWriter(new FileOutputStream("Output.csv"),"UTF-8"), ';');
Hier gebe ich doch UTF-8 mit oder verstehe ich was falsch?

Liebe Grüße
 

Thallius

Top Contributor
So wie ich das verstehe bedeutet das ja nur, dass die Datei als "Zeichen sind UTF-8" geschrieben wird. Ob die Zeichen wirklich UTF-8 sind hängt aber davon ab was Du aus der DB ließt. Ich nehme mal an, dass die Daten in der DB Latin oder sowas sind. Du solltest also einfach mal deinen gelesenen String konvertieren mit z.B.

Code:
byte[] utf8 =newString(latin1,"ISO-8859-1").getBytes("UTF-8");

Gruß

Claus
 

gr33nhat

Mitglied
@Thallius bin gerade ein wenig überfordert :confused: könntest du evtl. ein Bsp. geben?
Ich bekomme ja mit
String sql = <query>;
ResultSet rs = stmt.executeQuery(sql);
meine Daten ausgelesen.
Wie bekomme ich da am besten deine Zeile unter?
Kann ich nicht das gesamte ResultSet konvertieren?

@ARadauer es handelt sich um eine Zahl nicht um einen String
 

gr33nhat

Mitglied
@thet1983 danke für das heraussuchen.

Ich habe mir nun einen anderen Weg überlegt.
Glaube aber ich habe einen Denkfehler.

Java:
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
    String name1 = rs.getString("Artikelbeschreibung");
    int name2 = rs.getInt("Lagerbestand");
    System.out.println(name1+";"+name2);
};

Mit diesen Zeilen bekomme ich auf der Konsole

Druckspannzange 1446E (F30) rund DIN 6343 Ø 23,0 mm;2
Druckspannzange 1446E (F30) rund DIN 6343 Ø 24,0 mm;6
Druckspannzange 1446E (F30) rund DIN 6343 Ø 25,0 mm;2
Druckspannzange 1536E (F37) rund DIN 6343 Ø 2,0 mm;3
Druckspannzange 1536E (F37) rund DIN 6343 Ø 2,5 mm;3

angezeigt. Genau diese Ausgabe würde ich jetzt gerne in eine Textdatei speichern.
Nun wenn anstatt System.out.println(); es in eine Variable speichere bekomme ich leider nur einen Wert zurück.
Habt ihr eine Idee, wie ich die gesamte while Schleife speichern uns ausgeben kann?

Sry... aber stehe gerade total auf dem Schlauch.

Liebe Grüße
 

Maggot

Bekanntes Mitglied
angezeigt. Genau diese Ausgabe würde ich jetzt gerne in eine Textdatei speichern.
Nun wenn anstatt System.out.println(); es in eine Variable speichere bekomme ich leider nur einen Wert zurück.
Habt ihr eine Idee, wie ich die gesamte while Schleife speichern uns ausgeben kann?

Wie versuchst du es in einer Datei zu speichern?

Ich würde es so machen:
Java:
ResultSet rs = stmt.executeQuery(sql);
        BufferedWriter bw = new BufferedWriter(new FileWriter(new File("C:/test.txt")))
        while(rs.next()){
           String artikelbeschreibung = rs.getString("Artikelbeschreibung");
           int lagerbestand = rs.getInt("Lagerbestand");
           bw.write(artikelbeschreibung + ";" + lagerbestand);
        };
 

gr33nhat

Mitglied
Wollte mich noch einmal bedanken. Hat alles wunderbar geklappt. War nur eine weile nicht mehr dazu gekommen an dem Projekt weiter zu arbeiten.

Liebe Grüße
 

Neue Themen


Oben