Tabelle umwandeln

dicke_nudel

Mitglied
Nach 5 Tagen arbeit darf ich nun von vorne anfagen. Daher würde ich gerne mal hören wie ihr das evtl. Lösen würdet. Zum Problem:
Ich habe eine CSV Datei welche ich einlesen muss. Dies könnte ich z.B. mit opencsv machen.

Das knifflige an der Sach ist folgendes:

Aus einer Tabelle :

ID|Spalte1|Spalte2|Spalte3|
idxx9|1|5|abc|
idxx10|1|6|abc|
Soll das entstehen:

ID|Spalte1_1|Spalte2_5|Spalte2_6|Spalte3_abc|
idxx9|1|1|0|1|
idx10|1|0|1|1|

Ich muss also aus allen Werten welche vorkommen können eine Spalte machen und diese binär darstellen.
Ich weiss nicht wie ich dies lösen soll. Jemand eine Idee?
 
Zuletzt bearbeitet:

kay73

Bekanntes Mitglied
Java:
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class CSVApp {

	final static String[][] CSV = {
		{"idXX9", "1", "5", "abc"},
		{"idXX10", "1", "6", "abc"},
		{"idXX11", "1", "abc"},
		{"idXX12", ""},
		{"idXX12", "xyz","4", "5", "6"},
	};
	
	public static String [][] buildTable (final String[][] csv) {
		
		// Alle vorkommenden Werte außer den "IDxxx?" in einem Set speichern
		// zwecks Eindeutigkeit
		final Set<String> columns = new LinkedHashSet<String>();
		
		for(final String [] line : csv) {
			// Position "0" ist durch "IDxxx" belegt
			for(int i=1; i < line.length; i++) {				
				columns.add(line[i]);
			}
		}
		
		// Alle vorkommenden Werte auch als Array speichern; Wird als
		// vorlage für die Spalten benutzt
		final String [] columnsArray = columns.toArray(new String[]{});
		
		// Zieltabelle, +1 ist für die Kopfzeile
		final String [][] table = new String[csv.length+1][columnsArray.length];

		// Kopfzeile bauen, das "Spalte_..." spare ich mir. +1 für "ID"
		final String tableHeader [] = new String [columns.size()+1];	
		tableHeader[0]="ID";		
		System.arraycopy(columnsArray, 0, tableHeader, 1, columnsArray.length);			
		table[0] = tableHeader;
		
		// Zeilenzähler, Position 0 ist duch die Kopfzeile belegt
		int offset=1;
		
		for(final String [] row : csv) {
			
			final String [] resultRow = new String[columnsArray.length+1];
			
			// Hier tragen wir das "idXX???" ein
			resultRow[0] = row[0];
			
			// Die Elemente der Zeile in ein HashSet für den lookup kopieren
			final Set<String> elements = new HashSet<String>();
			Collections.addAll(elements, row);

			// Spaltenzähler, Position 0 ist durch "IDxxx" belegt
			for(int i=1; i < resultRow.length; i++) {
				// Man könnte alternativ auch mit Collections.frequency() sogar die
				// Häufigkeiten zählen...
				resultRow[i] = (elements.contains(columnsArray[i-1]) ? "1" : "0");
			}
			table[offset]=resultRow;
			offset++;
		}
		
		return table;
	}
	
	public static void main(String[] args) {

		final String [][] table = buildTable(CSV);
		
		final StringBuilder b = new StringBuilder();
		
		for(final String [] row : table) {
			for(final String col : row) {
				b.append("\t"+col);
			}
			
			b.append("\n");
		}
		
		System.out.println(b.toString());
	}
}
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Versuch's auch mal so:
Java:
import java.util.*;

public class TableConvertDemo {

    private List<List<String>> columns;

    public TableConvertDemo() {
        List<List<String>> table1 = getDemoData();
        List<List<String>> table2 = convertToBinary(table1);
        String cols = "";
        for (List<String> list : columns) {
            cols += list.get(1) + ",";
        }
        System.out.println(cols.substring(0, cols.length() - 1));
        for (List<String> list : table2) {
            String row = "";
            for (String string : list) {
                row += string + ",";
            }
            System.out.println(row.substring(0, row.length() - 1));
        }
    }

    private List<List<String>> convertToBinary(final List<List<String>> table) {
        createBinaryColumns(table);
        List<List<String>> binaryTable = new ArrayList<List<String>>();
        initBinaryTable(table, binaryTable);
        for (int row = 0; row < binaryTable.size(); row++) {
            List<String> rowData = binaryTable.get(row);
            for (int column = 1; column < rowData.size(); column++) {
                List<String> column1 = columns.get(column - 1);
                String value1 = column1.get(1);
                int column2 = Integer.parseInt(column1.get(0));
                String value2 = table.get(row).get(column2);
                if (value1.equals(value2)) {
                    rowData.set(column, "1");
                }
            }
        }
        return binaryTable;
    }

    private void createBinaryColumns(final List<List<String>> table) {
        columns = new ArrayList<List<String>>();
        for (int column = 1; column < table.get(0).size(); column++) {
            for (int row = 0; row < table.size(); row++) {
                String value = table.get(row).get(column);
                List<String> col = new ArrayList();
                col.add(String.valueOf(column));
                col.add(value);
                if (!columns.contains(col)) {
                    columns.add(col);
                }
            }
        }

    }

    private void initBinaryTable(final List<List<String>> table, final List<List<String>> binaryTable) {
        for (int row = 0; row < table.size(); row++) {
            ArrayList<String> rowData = new ArrayList<String>();
            rowData.add(table.get(row).get(0));
            for (int column = 0; column < columns.size(); column++) {
                rowData.add("0");
            }
            binaryTable.add(rowData);
        }
    }

    private List<List<String>> getDemoData() {
        //für die Demo generieren wir die Ausgangstabelle intern:
        List<List<String>> table = new ArrayList<List<String>>();
        List rowData = new ArrayList();
        rowData.add("idxx9");
        rowData.add("1");
        rowData.add("5");
        rowData.add("abc");
        table.add(rowData);
        rowData = new ArrayList();
        rowData.add("idxx10");
        rowData.add("1");
        rowData.add("6");
        rowData.add("abc");
        table.add(rowData);
        return table;
    }

    public static void main(final String[] args) {
        TableConvertDemo convertTableToBinary = new TableConvertDemo();
    }
}
 

dicke_nudel

Mitglied
Java:
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class CSVApp {

	final static String[][] CSV = {
		{"idXX9", "1", "5", "abc"},
		{"idXX10", "1", "6", "abc"},
		{"idXX11", "1", "abc"},
		{"idXX12", ""},
		{"idXX12", "xyz","4", "5", "6"},
	};
	
	public static String [][] buildTable (final String[][] csv) {
		
		// Alle vorkommenden Werte außer den "IDxxx?" in einem Set speichern
		// zwecks Eindeutigkeit
		final Set<String> columns = new LinkedHashSet<String>();
		
		for(final String [] line : csv) {
			// Position "0" ist durch "IDxxx" belegt
			for(int i=1; i < line.length; i++) {				
				columns.add(line[i]);
			}
		}
		
		// Alle vorkommenden Werte auch als Array speichern; Wird als
		// vorlage für die Spalten benutzt
		final String [] columnsArray = columns.toArray(new String[]{});
		
		// Zieltabelle, +1 ist für die Kopfzeile
		final String [][] table = new String[csv.length+1][columnsArray.length];

		// Kopfzeile bauen, das "Spalte_..." spare ich mir. +1 für "ID"
		final String tableHeader [] = new String [columns.size()+1];	
		tableHeader[0]="ID";		
		System.arraycopy(columnsArray, 0, tableHeader, 1, columnsArray.length);			
		table[0] = tableHeader;
		
		// Zeilenzähler, Position 0 ist duch die Kopfzeile belegt
		int offset=1;
		
		for(final String [] row : csv) {
			
			final String [] resultRow = new String[columnsArray.length+1];
			
			// Hier tragen wir das "idXX???" ein
			resultRow[0] = row[0];
			
			// Die Elemente der Zeile in ein HashSet für den lookup kopieren
			final Set<String> elements = new HashSet<String>();
			Collections.addAll(elements, row);

			// Spaltenzähler, Position 0 ist durch "IDxxx" belegt
			for(int i=1; i < resultRow.length; i++) {
				// Man könnte alternativ auch mit Collections.frequency() sogar die
				// Häufigkeiten zählen...
				resultRow[i] = (elements.contains(columnsArray[i-1]) ? "1" : "0");
			}
			table[offset]=resultRow;
			offset++;
		}
		
		return table;
	}
	
	public static void main(String[] args) {

		final String [][] table = buildTable(CSV);
		
		final StringBuilder b = new StringBuilder();
		
		for(final String [] row : table) {
			for(final String col : row) {
				b.append("\t"+col);
			}
			
			b.append("\n");
		}
		
		System.out.println(b.toString());
	}
}

Die Daten kommen bei mir aber als List<String[]> rein. Jedenfalls bietet das opencsv so an. Wie kann ich deiner build Table eine List<String[]> übergeben? Für mich ist die Nennung des alten Spaltennamens wichtig. Ich brauche also OrigName+_+Wert = Neuer Spaltenname.

Mein Einlesen:
Java:
public static  String[][] readCSV(String pathToCSV){
        CSVReader reader;

        try {
            reader = new CSVReader(new FileReader(pathToCSV));

            List<String[]> myEntries = reader.readAll();
            String[][] data = new String[myEntries.get(0)[0].length()][myEntries.size()];
            return data;
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

Wobei ich mir sicher bin das ich die Initialisierung von data nicht richtig gemacht habe.
 
M

Marcinek

Gast
Unabhängig von dem (trivialen) Problem, das weiter oben bereits gelöst ist:

CSV Dateien haben die Eigenschaft, dass jede Zeile ienen unabhängigen Datensatz darstellt.

Ich würde eine Datei Zeile für Zeile Parsen und nicht alle Datensätze einlesen.

Bei einer Migration musste ich Datei von mehreren GB importieren. Wenn man jede Datei komplett in den Speicher läd, dann geht da garnix mehr.

Gruß,

Marcinek
 

dicke_nudel

Mitglied
Unabhängig von dem (trivialen) Problem, das weiter oben bereits gelöst ist:

CSV Dateien haben die Eigenschaft, dass jede Zeile ienen unabhängigen Datensatz darstellt.

Ich würde eine Datei Zeile für Zeile Parsen und nicht alle Datensätze einlesen.

Bei einer Migration musste ich Datei von mehreren GB importieren. Wenn man jede Datei komplett in den Speicher läd, dann geht da garnix mehr.

Gruß,

Marcinek

Hast recht. Meine hat zwar nur einpaar MB, das kann sich aber auch immmer ändern.
Mein Problem liegt darin das ich die Zeile als String[] bekomme. Die Lösung aber ein String[][] braucht. Dann wär mein Programm fertig.
 

dicke_nudel

Mitglied
List.toArray();

oder manuell konverieren.

Ich habe keine Liste. Sondern ein String[]. Siehe:
Java:
public static  String[][] readCSV(String pathToCSV){
        CSVReader reader;

        try {
            reader = new CSVReader(new FileReader(pathToCSV));

            String [] nextLine;
            while ((nextLine = reader.readNext()) != null) {
                // nextLine[] is an array of values from the line
                for (int i = 0; i < nextLine.length; i++) {    //Hier wird jetzt einfach alles mal ausgegeben. Es sollte aber alles in ein Strin[][]
                    System.out.println(nextLine[i]);
                }
            }

            
            return null;
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

Meinst du ich soll alles in eine List<Strin[]> tun um dann die Liste per List.to(Array) zu wandeln?
 
M

Marcinek

Gast
Sorry, dann natürlich umgekehrt.

Eine Zeile ist String[] oder List<String>;

Ganze Dateien sind String[][] oder List<List<String>> oder List<String[]>;

Um von einem Array eine Liste zu bekommen kann man Arrays.asList() nehmen.
 

ARadauer

Top Contributor
ich würds an deiner Stelle einfach manuell machen. Das kann man als Anfänger leichter nachvollziehen.
zb
Java:
ArrayList<String[]> list = new ArrayList<String[]>();          
          String [] nextLine;
          while ((nextLine = reader.readNext()) != null) {
              // nextLine[] is an array of values from the line
             list.add(nextLine);
          }
          
          String[][] result = new String[list.size()][];
          for(int i =0; i < list.size(); i++){
             result[i] = list.get(i);             
          }
          return result;
 
M

Marcinek

Gast
Auf keinen Fall. Das opencsv kann auch Dateien lesen, die enclosing " haben.


Der TO möchte aber per copy paste die o.g. Lösung nehmen und bei sich einbauen, ohne zu verstehen, was es macht.

Das wird nicht ohne weiteres gehen.

Aber in der While schleife kann man einfach die erste Zeile nehmen und die Header draus machen.

Alle anderen Zeilen konvertieren, wie man will und zu einer neuen Liste mit zeilenarrays zusammenfügen.


Gruß,

Marcinek
 

dicke_nudel

Mitglied
Auf keinen Fall. Das opencsv kann auch Dateien lesen, die enclosing " haben.


Der TO möchte aber per copy paste die o.g. Lösung nehmen und bei sich einbauen, ohne zu verstehen, was es macht.

Das wird nicht ohne weiteres gehen.

Aber in der While schleife kann man einfach die erste Zeile nehmen und die Header draus machen.

Alle anderen Zeilen konvertieren, wie man will und zu einer neuen Liste mit zeilenarrays zusammenfügen.


Gruß,

Marcinek

Da haste leider recht. Ich geh jetzt den code Stück für Stück durch. Ich weiss schonmal das ich beim Einlesen ein String.split(;) machen muss. Das gibt mir dann ein String[] zurück. Dies wäre dann meine Zeilen. Weiter komme ich bis jetzt nicht.

Vielen Dank für eure bisherigen Antworten
 
M

Marcinek

Gast
Wenn du etwas mit opencvs und split() machst, dann machst du was falsch.

P.S. Ich habe dir dazu eine PM geschickt.

Gruß,

Marcinek
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Bild in text tabelle umwandeln Allgemeine Java-Themen 2
A Trace-Tabelle erstellen Allgemeine Java-Themen 3
G Excel Tabelle lesen und in neue Excel Tabelle einfügen Allgemeine Java-Themen 11
L Hash-Tabelle Allgemeine Java-Themen 2
F Tabelle aus CSV, 2 dimensionale HashMap? Allgemeine Java-Themen 4
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
H Zweidimensionales Array - Zellen der Tabelle verbinden Allgemeine Java-Themen 2
C Zeilen-"Vektor" aus Excel-Tabelle suchen Allgemeine Java-Themen 0
J Datentypen in Java Tabelle Allgemeine Java-Themen 2
T 4x4 Tabelle als Bitboard darstellen Allgemeine Java-Themen 5
P Reordering einer Tabelle im Frontend Allgemeine Java-Themen 1
S 2-spaltige Ausgabe als Tabelle ausgeben Allgemeine Java-Themen 12
K Apache POI Word Tabelle Zellen verbinden Allgemeine Java-Themen 4
K Apache POI Word Tabelle Spaltenbreite festlegen Allgemeine Java-Themen 7
G Tabelle wird nicht richtig dargestellt Allgemeine Java-Themen 9
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
Todesbote Zeilen aus Excel in andere Excel Tabelle kopieren Allgemeine Java-Themen 0
R HTML Tabelle durchsuchen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
G Combobox füllen mit daten aus einer Tabelle Allgemeine Java-Themen 4
Iron Monkey Spalte der Tabelle abwechselnd färben Allgemeine Java-Themen 8
Joew0815 JList + JTableModel: Parameter der Tabelle übergeben Allgemeine Java-Themen 10
K HTTP Auslesen einer Tabelle Allgemeine Java-Themen 8
S EAN-Code Tabelle für CD's Allgemeine Java-Themen 2
R Datum in Excel Tabelle eintragen Allgemeine Java-Themen 6
A Tabelle mit iText erstellen Allgemeine Java-Themen 3
M Aus Excel Tabelle lesen und Werte in Array speichern Allgemeine Java-Themen 15
P java tabelle auslesen - xls (excel) fehler Allgemeine Java-Themen 5
A Excel Tabelle in JFrame darstellen Allgemeine Java-Themen 6
K LibreOffice Tabelle Dateien im Format .ods bearbeiten Allgemeine Java-Themen 2
M In einer Tabelle rechnen Allgemeine Java-Themen 12
M Rein informativ - Daten aus Excel-Tabelle in Java-Programm importieren Allgemeine Java-Themen 3
M Realisierung einer dynamischen Tabelle unter Android Allgemeine Java-Themen 3
nrg JDOM Tabelle lesen Allgemeine Java-Themen 6
S Javascript & MSAccess Tabelle Allgemeine Java-Themen 5
Weiti Programm zum erstellen einer tabelle aus textdateien Allgemeine Java-Themen 24
R Tabelle - Berechnung der "Zeilenart" Allgemeine Java-Themen 2
A Text durchgestrichen in einer Tabelle darstellen Allgemeine Java-Themen 2
D Spaltenbereite einer Tabelle Allgemeine Java-Themen 2
J Leerer Spalteninhalt in einer Tabelle in JSP Allgemeine Java-Themen 5
M Datum in Tabelle formatiert ausgeben Allgemeine Java-Themen 3
P Datenbank Tabelle spiegeln Allgemeine Java-Themen 22
G Probleme mit dem erstellen einer Tabelle Allgemeine Java-Themen 6
G Tabelle in ein Array schreiben Allgemeine Java-Themen 3
S Excel Tabelle Allgemeine Java-Themen 8
G HTML Tabelle auslesen Allgemeine Java-Themen 8
J Problem mit dem aktualisieren der Tabelle Allgemeine Java-Themen 8
B Tabelle. bei Wertänderung was bestimmtes machen Allgemeine Java-Themen 3
S Werte in Tabelle einfügen! Allgemeine Java-Themen 9
L Datenbank Abfrage (Felder&Tabelle nicht fix) in ArrayLis Allgemeine Java-Themen 4
M Daten in Excel Tabelle schreiben? Allgemeine Java-Themen 7
H Hash Tabelle einlesen und die Werte an ein Array übergeben Allgemeine Java-Themen 10
D iText: Tabelle in Footer einfügen Allgemeine Java-Themen 6
H Leere Tabelle initialisieren Allgemeine Java-Themen 2
JAnruVA Datentypen Berechneten String-Wert in Double umwandeln um weiter zu rechnen Allgemeine Java-Themen 7
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
N Regulären Ausdruck in normalen Java-Code umwandeln Allgemeine Java-Themen 12
K HTMLEditor HTML Text in Rich Text umwandeln Allgemeine Java-Themen 14
M Rechner dez in Hex umwandeln Allgemeine Java-Themen 5
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
J Objekt in Bytestream umwandeln Allgemeine Java-Themen 12
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
C String in Objektnamen umwandeln Allgemeine Java-Themen 3
E String in Zahl umwandeln, ohne Befehl Integer.parseInt Allgemeine Java-Themen 3
V Eingegeben String Splitten und in Integer umwandeln Allgemeine Java-Themen 2
RalleYTN Unsigned int in signed int umwandeln Allgemeine Java-Themen 8
G GUI-basiertes Java-Program in Command-line Version umwandeln Allgemeine Java-Themen 1
J .jar in .exe Umwandeln Allgemeine Java-Themen 18
JavaWolf165 JsonObject in HashMap umwandeln Allgemeine Java-Themen 16
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
T Geographische in UTM Koordinaten umwandeln Allgemeine Java-Themen 5
JG12111989 char-Array in int-Array umwandeln Allgemeine Java-Themen 27
D Library/Framework zum Umwandeln von Sound in Notenbilder Allgemeine Java-Themen 1
D AWT Tiff-Datei darstellen bzw in darstellbares Format umwandeln Allgemeine Java-Themen 2
K Applet in JApplet umwandeln Allgemeine Java-Themen 5
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
M Datum umwandeln. Allgemeine Java-Themen 1
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
P OpenCV mit Java - Bilder in Graustufenbilder umwandeln Allgemeine Java-Themen 2
B Transferable in String/Integer umwandeln Allgemeine Java-Themen 11
J Datentypen String in Float umwandeln und "umbauen"? Allgemeine Java-Themen 5
T Datei Ordner in Binär-Zahlenkette umwandeln Allgemeine Java-Themen 11
B Binaräres Format in Dezimalformat umwandeln u. dabei die Zwischenschritte ausgeben Allgemeine Java-Themen 3
J String-Typ in einen generischen Typ T umwandeln Allgemeine Java-Themen 6
B HTML Tags in Strings umwandeln Allgemeine Java-Themen 4
C Java-Dateien in einheitlichen Zeichensatz umwandeln Allgemeine Java-Themen 10
K Datum+Uhrzeit in Millisekunden (long) umwandeln Allgemeine Java-Themen 7
S Erste Schritte if-Anweisung in for- oder while-schleife umwandeln Allgemeine Java-Themen 3
Q Posgresql String Timestamp Umwandeln Allgemeine Java-Themen 2
H2SO3- String 1.000,00 in double umwandeln Allgemeine Java-Themen 12
J String in int umwandeln Allgemeine Java-Themen 8
S Array in String umwandeln Allgemeine Java-Themen 6
cedi int Zahl in ein ASCII zeichen umwandeln und dieses in ein externes Textfenster schreiben Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben