Input/Output Einlesen von CSV Dateien

Status
Nicht offen für weitere Antworten.

fget

Mitglied
Hallo miteinander, ich bin relativ neu hier und habe sozusagen eine Bitte. Meine Aufgabe ist zur Zeit ein Programm zu schreiben welches eine CSV datei einließt und diese zunächst in der Commandozeile von Netbeans(Programm) anzeigt. Ich habe bisher 3 Klassen
Eine zum eigentlichen einlesen der Datei, eine Zum konvertieren
(später) in ein XML format was zum Schluss ausgegeben werden soll.
Also hier die erste:

Java:
package phonebook;


 
        

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public final class convert
{
  static Document document;
  String[] list;
  String[] head;

  public static void readfile(String string[])
  {

    convert demo = new convert("home/guest/desktop/test.xml");

    demo.createXMLBasic();
    demo.loadCSV("home/guest/Desktop/test.csv"); // Einzulesende Datei weöche umgewandelt wird/werden soll.
    demo.speichern("home/guest/Desktop/test.xml"); // Wo soll die XML abgelegt werden?
  }

  public convert(String string)
  {
    newXMLFile(string);
  }

  public void newXMLFile(String string)
  {
    try
    {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      document = builder.newDocument();
    }
    catch (ParserConfigurationException pce)
    {
        System.out.println("Fehler");
     // pce.printStackTrace();
    }
    catch (Throwable t)
    {
      System.out.println("Fehler");
    }
  }

  public void createXMLBasic()
  {
    Element root = document.createElement("Person");
    document.appendChild(root);
  }

  public void loadCSV(String string)
  {
    // Methode zum Laden von CSV

    String Zeile = "";
    try
    {
      FileReader Eingabestrom = new FileReader(string);
      BufferedReader input = new BufferedReader(Eingabestrom);

      if((Zeile = input.readLine()) != null){
        head = Zeile.split(",");
        while ((Zeile = input.readLine()) != null)
        {
          list = Zeile.split(",");
          addData(list);
       
        }
      }
      while (Zeile != null){
      input.close();
        }
    }catch (IOException e)
    {
      System.out.println("Fehler beim Lesen der Zeile");
    }
  }


  public void addData(String[] data)
  {
    Element root = document.getDocumentElement();

    try
    {
      for(int i =0; i<head.length ;i++)
      {
        Element element = document.createElement(head[i]);
        root.appendChild(element);
        element.appendChild(document.createTextNode(data[i]));
      }


    }
    catch (DOMException ex)
    {
     System.out.println("Fehler beim Erzeugen des Dokumentes");
    }
  }

  public void speichern(String string)
  {
    try 
    {
      XMLOutputter outputter = new XMLOutputter();

      outputter.output(document,new FileOutputStream(string));
    }
    catch (IOException e)
    {
      System.out.println("Fehler beim Ausgeben der XML-Datei");
    }
  }

}

So die zweite sollte das umwandeln ( tut sie nicht, es kommt aber auch kein Error:



Java:
import java.io.OutputStream;
import java.io.PrintWriter;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;




public class XMLOutputter
{

  public void output(Document document, OutputStream out ){
    PrintWriter writer = new PrintWriter(out);
    travers(document,writer);
    writer.close();
  }

  private void travers(Node node, PrintWriter out){
    switch(node.getNodeType()){
      case Document.DOCUMENT_NODE:
        NodeList list=node.getChildNodes();
        out.println("<?xml version='1.0' encoding='iso-8859-1' ?>");
        for(int i=0; i< list.getLength();i++){
          travers(list.item(i), out);
        }
        break;
      case Document.ELEMENT_NODE:
        list=node.getChildNodes();
        out.println("<"+node.getNodeName()+">");
        for(int i=0; i< list.getLength();i++){
          travers(list.item(i), out);
        }
        out.println("</"+node.getNodeName()+">");
        break;
      case Document.TEXT_NODE:
        out.println(node.getNodeValue());
        break;
    }
  }


}

Und meine dritte Klasse sieht so aus(da wollte ich erstmal die Lines so anzeigen ohne Ordnung, Trennung der Zeichen ect. :

Java:
import java.io.*;


public class LineByLine {

    public static void main(java.lang.String[] args){
    
    public static void main () throws IOException {

       

        String fileName = "/home/guest/Desktop/test" ; //einzulesende Datei wird 


        FileInputStream f = new FileInputStream(fileName);




        LineNumberInputStream fileStream = new LineNumberInputStream(f);
        try{
            int c;
            System.out.print("Line 1;");

                    while((c=fileStream.read()) != -1)

                        System.out.print((char) c);
                    if (c=='\n') {

                        System.out.print("Line"+(fileStream.getLineNumber()+1)
                                + ",");
                    }
            
        } catch (IOException e) {
            System.out.println("Fehler beim Ausgeben der Daten-Lines!");

        }
        }

    }

So und meine Main.java( ist leer, weiß nich genau wie ich die andern Klassn da einbinde?!?!):

Java:
package phonebook;


public class Main {

 
    public static void main(String[] args) {
        


    }

}

So also hab soweit probiert eine CSV Datei einzulesen( Folgendes Format, und dies ist nur ein kleiner Ausschnitt):

Code:
[Datenberge entfernt]





Aber es geschieht nix. Ich weiß auch nich warum bei der LineByLine Klasse manche Wörter ( LineNumberInputStream fileStream = new LineNumberInputStream(f);) Durchgestrichen werden also von Netbeans selber.

Könnte da mal jemand drüber schauen? Wäre super. Denn dies ist meine Praktikumsaufgaube und würde einen tollen Eindruck hinterlassen wenns klappt ^^ .

Danke schon mal.:)
 
Zuletzt bearbeitet von einem Moderator:

Swoop

Gesperrter Benutzer
Hey,

also das nichts passiert ist ja erstmal klar. Solange nichts in der Main-methode aufgerufen wird, kann das Programm auch nichts machen.

Zunächst mal schreibt man Klassen groß ;)
Die durchgestrichenen Methoden sind depricated. Das bedeutet der Entwickler (Sun/Oracle) sagen, dass man diese Methoden oder Klassen nicht mehr verwenden soll. Es gibt also bessere neuere Möglichkeiten dies zu machen. Die Methoden werden nur deshalb nicht entfernt aus den Packages, damit alte Projekte, welche eine neuere Version einbinden, nicht komplett umprogrammiert werden müssen.
Das heißt die deprecated-Methoden solltest du nicht mehr verwenden und lieber nach alternativen suchen.
Dein Programm könntest du starten indem du

[Java]convert.readFile(null);[/Java] aufrufst.
Der Parameter wird hier momentan nicht genutzt. Soll wohl aber später dazu dienen, dass die Pfade übergeben werden?
Warum machst du einen statischen Aufruf für die convert-Klasse ?

Grüße Swoop
 

fget

Mitglied
Hi, erstmal. Danke für eine schnelle Antwort schonmal.
Ich habe mir überlegt nochmal neu zu beginnen. Strukturierter :) . Vielleicht kannst du mir als Anfänger so gleich besser helfen. Ich will also zunächst erstmal die Datei einlesen und anzeigen, die Kommas sollen dabei noch nich beachtet werden.

Meine main Klasse sieht also insgesamt so aus( aber es kommt ein fehler das er CSV Reader nicht kennt,obwohl dies in meinen Libraries drin steht:

Java:
package phonebook2;


public class Main {
    
    
    
    

  
    public static void main(String[] args) {
        



        
    CSVReader reader = new CSVReader (new FileReader("test.csv"));
    
    String [] nextLine;
    
              while ((nextLine = reader.readNext()) != null) {  //nextLine[] ist ein Array der Werte von line
             
       
              System.out.println(nextLine[0] + nextLine[1] + "etc...");
        
    }
            
        
      
    }

}


So dabei müsste er ja die Angegebnen Lines ausgeben. Nur kennt er CSVReader halt nicht.

:( ich häng hier fest
 

Swoop

Gesperrter Benutzer
Hallo,

ich denke auch, dass das die bessere Idee ist. Allerdings kenne ich die Library von CSVReader nicht.Das er die Klassen nicht kennt liegt daran, dass du erst die Imports dafür organisieren musst. Das heißt es müsste nach dem package und vor der Klassendefinition mit import package.CSVReader geben....

Grüße Swoop
 

fget

Mitglied
Ich habe mir sozusagen ein "Add-On" mit dem csvreader von opencsv - Frequently Asked Questions runtergeladen, kannst ja mal bitte gucken was da alles drin ist ( wäre super) denn ich weiß gar net ob ich da alles brauche. Müsste ich da eine neue Klasse mit dem CSVReader anlegen? Bin grad so verzweifelt. ;(
 
Zuletzt bearbeitet:

Swoop

Gesperrter Benutzer
Das Projekt sieht doch schonmal ganz gut aus ... Es gibt halt eine relativ einfache Möglichkeit CSV-Dateien einzulesen und zu schreiben.
Dein Code stimmt soweit ich sehen kann und laut dem Beispiel auch! Du musst nur noch den Import hinzufügen! Dazu gibts in Eclipse(IDE) nen extra Befehl. Den gibts in Netbeans bestimmt auch.
Dann sollte es funktionieren
 

fget

Mitglied
Aber welchen Import denn, wenn ich bisher nur eine Klasse habe? Oder was meinst du mit Import?

Edit 1: Wie würdest du den Import jetzt schreiben? Oder vor allem wo? Wäre sehr hilfreich. :)
 
Zuletzt bearbeitet:

fget

Mitglied
Hey, danke schonmal , ich habs jetzt anders probiert mit nem Tokenizer. Da klappt das einlesen der Datei schon mal, nur hab ich grad keine Ahnung wie ich da die einzelnen Infomationen Isolieren soll.

Bisher:

Java:
package phonebook2;

import au.com.bytecode.opencsv.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.StringTokenizer;

public class Main{
    
     
public static void main( String[]arg){
            try

                {
                        String strFile = "Outlook_Contacts.csv";

                        BufferedReader br = new BufferedReader( new FileReader(strFile));
                        String strLine = "";

                        StringTokenizer st = null;

                        int lineNumber = 0, tokenNumber = 0;
                        
                        
                        
                        
                        //Komma getrennte lesen (Zeile für Zeile)

                        while( (strLine = br.readLine()) != null)

                        {
                            lineNumber++;
                            
                                //Pausenkomma separiert Die Lines ---> ","

                                st = new StringTokenizer(strLine, ",");

                               

                                while(st.hasMoreTokens())

                                {

                                        //zeigt sozusagen den CSV-Wert

                                        tokenNumber++;

                                        System.out.println("Zeile # " + lineNumber +

                                                        ", Zeichen(Nummer) # " + tokenNumber

                                                        + ", Zeichen : "+ st.nextToken());

                               }

                                        tokenNumber = 0;    //Zeichen bzw. Token Nummer zurücksetzen

                               }
                        }

                catch(Exception e) //Beim Eintritt eines Fehlers gibt "e" den Inhalt
                                   //des Fehlers(Vom System) an System.out.println weiter.

                {

                        System.out.println("Fehler beim Lesen der CSV-Datei: " + e);

                }

        }

     }

Hier nochmal ein Auszug der .csv Datei:

[Datenberge entfernt]

Das ist aber nicht korrekt da die jeweiligen Zuordnungen von Name und E-Mail z.B nicht stimmen. :autsch:

Sozusagen wenn man sich den Output ansieht müsste man nach dem "N" am ende jeder Telefonnummer ein Absatz machen dann würde das glaub stimmen. Oder?

PS: Bisschen Sourcecode wär nicht falsch! ;) Speziell was das sortierte anzeigen anbelangt wär das sehr hilfreich.
 
Zuletzt bearbeitet von einem Moderator:
M

Marcinek

Gast
Sieht so aus, als ob die CSV Datei verunstaltet ist.

Normalerweise hast du pro Zeile genau einen Datensatz.

Und das N hätte eher ein \n sein sollen.
 
M

Marcinek

Gast
Dann wende dich an den Urheber der Datei oder du kannst nicht readLine() nehmen sondern dies selber implementieren mit deinen eigenen Kriterien für Zeilenabgrenzung.
 

fget

Mitglied
Sieh mal zu meinem Profil rüber. Und was bemerkt? Richtig ich bin ein ANFÄNGER. Ich bin heilfroh das ich das soweit hinbekommen hab. Und was sollte an der Datei verunstaltet sein? Jede Zeile muss nicht unbedingt nur einen Datensatz enthalten( hab ich mal nachgeschaut) also ist das vorliegende Dokument durchaus verwendbar.
 
M

Marcinek

Gast
Wenn in einer Zeile mal mehr mal weniger Spalten sind, wie willst du diese dann automatisch verarbeiten??

Also eine CSV Datei zeichnet sich dadurch aus, dass jede Zeile gleich ist.

Beduetet: Es gibt eventuell einen Header (den kan nich bei dir sehen), der vorgibt, wieviele Spalten die Datei hat.

JEDE nachfolgende Zeile hat die gleiche Anzahl der Spalten.

Wenn nun bei dir ein N mitten im Datensatz sagt, dass du da ein Zeilenumbruch machen musst, dann ist das nicht korrekt.

Öffne mal die Datei mit Excel und lass dir jede Spalte in einer Excelspalte anzeigen.

---
Und gerade als Anfänger ist es wichtig die Basisc zu verstehen. Und zu verstehen, womit man es hier zu tun hat.
Sicher werde ich nicht anfangen Lösungen an Anfänger zu verteilen oder hier Romane zu schreiben zu Themen, die übrall schon beschrieben sind.
 
Zuletzt bearbeitet von einem Moderator:

fget

Mitglied
Sorry arbeite hier mit Linux da hab ich kein Excel drauf, soll ich mal die komplette csv Datei posten? Vielleicht siehst du dann das Problem besser?
 
M

Marcinek

Gast
Ja dann uploade sie hier ;)

Ich bin mir sicher, dass sie kaputt ist ^^
 
G

Gast2

Gast
das ist kein Upload. Du kannst Dateien hier hochladen. Wenn du auf Antworten klickst gibts unten die Möglichkeit Dateien anzuhängen. Durch das posten könnten Zeilenumbrüche und Zeichen verfälscht werden.

Bitte nochmal die Datei als solche!
[EDIT]
Sollten das echte Daten sein würde ich mich mal über Datenschutz informieren ...[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
CSV Dateien sind enifache Textdateien. Benenne sie eben in Name.txt um dann gehts auch. Wir können dir ja dann wieder in eine NAME.csv zurück umbennen.

PS: Ich habe nicht behauptet du wärst dumm...
 

fget

Mitglied
okay hier bitte. Schau es dir mal in Ruhe an.

Mein Quelltext dazu nochmal:

Java:
package phonebook2;

import au.com.bytecode.opencsv.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.StringTokenizer;

public class Main{
    
     
public static void main( String[]arg){
            try

                {
                        String strFile = "Outlook_Contacts.csv";

                        BufferedReader br = new BufferedReader( new FileReader(strFile));
                        String strLine = "";

                        

                        StringTokenizer st = null;

                        int lineNumber = 0, tokenNumber = 0;
                        
                        
                        
                        
                        //Komma getrennte lesen (Zeile für Zeile)

                        while( (strLine = br.readLine()) != null)

                        {
                            lineNumber++;
                            
                                //Pausenkomma separiert Die Lines ---> ","

                                st = new StringTokenizer(strLine, ";");

                               

                                while(st.hasMoreTokens())

                                {

                                        //zeigt sozusagen den CSV-Wert

                                        tokenNumber++;

                                        System.out.println("Zeile # " + lineNumber +

                                                        ", Zeichen(Nummer) # " + tokenNumber

                                                        + ", Zeichen : "+ st.nextToken());

                               }

                                        tokenNumber = 0;    //Zeichen bzw. Token Nummer zurücksetzen

                               }
                        }

                catch(Exception e) //Beim Eintritt eines Fehlers gibt "e" den Inhalt
                                   //des Fehlers(Vom System) an System.out.println weiter.

                {

                        System.out.println("Fehler beim Lesen der CSV-Datei:" + e);

                }

        }

     }
 
Zuletzt bearbeitet von einem Moderator:

Swoop

Gesperrter Benutzer
Also die Datei ist auf jedenfall verwendbar nur die Zeilenumbrüche wurden bei mir zumindest nicht richtig dargestellt und deshalb hats nicht funktioniert ...
 
G

Gast2

Gast
Zeile 26 ist zu lange und seltsamerweise mit 'N' getrennt. Da dürfte der Fehler liegen!
 

fget

Mitglied
Kann ich das selber beheben bzw. müsste ich jedes N durch ein Kommata ersetzen? Oder was könnte man machen?
 
Zuletzt bearbeitet:
G

Gast2

Gast
Das weiss meine Glaskugel nicht.

Ich vermute das sollen auch komplette Datensätze sein heisst du könntst versuchen die N durch ein Linefeed zu ersetzen. Um sicher zu gehen müsstest du den Ersteller mal fragen was er sich dabei gedacht hat.

Zum testen kannst du den Rest dieser Zeile auch mal wegschmeissen und gucken obs dann geht.
 
G

Gast2

Gast
scnr, too: Schau doch mal sein Profil er ist Anfänger!!!!

Sollen sich Anfänger die ganze Zeit mit Google bschäftigen?

Nein, aber wenn ich einen Begriff nicht kenne, der wichtig ist wenn man mit plain text files auslesen und sowas arbeitet dann kann ich erwarten, dass man sich wenigstens 2 Minuten damit beschäftigt einen solchen Begriff zu ergründen. Zumal man bei einer Google Suche nur nach Linefeed wirklich mehr als ausführliche Infos bekommt.
 
T

Tomate_Salat

Gast
Du hast Echtdaten hochgeladen!? Dazu noch sowas wie Kontonr, Blz und was weiß ich noch alles?!
An deiner Stelle würde ich mal die Moderation darum bitten, diese wieder zu entfernen und mir mal Gedanken machen, ob für so einen Fall nicht Demodaten ausgereicht hätten (Antwort: ja hätten sie).

Jaja, willkommen im Zeitalter von Facebook :-/
 

fget

Mitglied
Du hast Echtdaten hochgeladen!? Dazu noch sowas wie Kontonr, Blz und was weiß ich noch alles?!
An deiner Stelle würde ich mal die Moderation darum bitten, diese wieder zu entfernen und mir mal Gedanken machen, ob für so einen Fall nicht Demodaten ausgereicht hätten (Antwort: ja hätten sie).

Jaja, willkommen im Zeitalter von Facebook :-/

Vor allem Echtdaten..... Als würde ich Echtdaten hochladen. Gotteswillen hier, eigentlich nur von Unwissenden umgeben? Suche doch nach den Daten! Wirst nix finden omg!!
 
F

Firephoenix

Gast
Zeile 26:
Kurt-Schwabe-Institut fuer Mess- und Sensortechnik e.V. Meinsberg
Tab Mitarbeiter.

Wenigstens die Daten aus der Zeile waren wohl public - wäre trotzdem super wenn jemand die Daten hier rausnehmen könnte - über die Dummheit mancher Leute kann man echt nur den Kopf schütteln.
Ich hoffe so jemand arbeitet nie mit meinen Daten wenn ich irgendwo als Kunde angemeldet bin.

[EDIT]Englisch scheinst du ja zu können wenn ich den post hinter mir anschaue, im übrigen hat das Board hier eine sehr gute und freundliche Community bei der viele Leute extrem viel Knowlegde mitbringen, ähnlich hochwertige Foren zu Java wirst du im deutschen Raum selten finden.[/EDIT]

Gruß
 
Zuletzt bearbeitet von einem Moderator:
S

S-T-UPIDad-mins

Gast
Haha look here, what some stupid admins. Really the worst Community ive ever seen HAHAHA
There arent any Pros with enough knowledge about Java. really poor members.
 
T

TryToHelp

Gast
[OT]Das ist ja ein echt qualifizierter Beitrag ;-)
Erst sich Schritt für Schritt das Programm erstellen lassen und immer nach Quellcode verlangen und dann die Community runtermachen obwohl sie geholfen hat, nur weil sie dir nicht deinen Code komplett erstellt hat.
Das zeigt die größe deines Charakters, welche gegen 0 geht, wenn es so viel ist. Das ist echt erbärmlich =([/OT]
 
T

Tomate_Salat

Gast
Vor allem Echtdaten..... Als würde ich Echtdaten hochladen. Gotteswillen hier, eigentlich nur von Unwissenden umgeben? Suche doch nach den Daten! Wirst nix finden omg!!
Das war wohl ein Fail. Ich habe nach den Daten gegoogelt und die Zuordnungen haben gepasst. Dein peinlicher Gastauftritt passt auch zu deinem restlichen Auftreten. Ich würde mir mal Gedanken machen, ob du daran nicht besser arbeitest. Die Art wie du dich hier gibst ist schon ziemlich ... dumm (sorry, anders kann ichs nicht sagen). Du solltest mal verstehen lernen, dass du hier etwas von uns willst und nicht umgekehrt.

Vote 4 Close.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben