Hey, ich muss für eine Übung folgendes erledigen:
Eine CSV-Datei einlesen, großer Datensatz(150mb); Inhalt: Country Code char(2),ASCII City Name varchar(100), City Name varchar(255),State/Region char(2),Population unsigned int, Latitude numeric (float)Longitude numeric (float), 3.3Millionen Städte.
-->soweit kein Problem. über buffered file reader eingelesen in ein Array. Collectionklassen dürfen nicht verwendet werden.
Ausgegeben werden sollen die 20 bevölkerungsreichsten Städte, optional soll die Zahl durch Kommandozeilenparameter variiert werden können.
Momentan sieht die Ausgabe folgendermaßen aus:
47981 //Zahl der Städte mit Bevölkerungszahl
AccentCity(Country)........Population
São Paulo(br)........10021437
Shanghai(cn)........14608512
Bombay(in)........12692717
Delhi(in)........10928270
New Delhi(in)........10928270
Tokyo(jp)........31480498
Seoul(kr)........10323448
Manila(ph)........10443877
Karachi(pk)........11627378
Moscow(ru)........10381288
Dubai(ae)........1137376
Kabul(af)........3043589
Yerevan(am)........1093499
Luanda(ao)........2776125
Cordoba(ar)........1441007
Rosario(ar)........1218497
Vienna(at)........1569315
Adelaide(au)........1074168
Brisbane(au)........1843459
Ich bekomme die Zahlen leider nicht in die Richtige Reihenfolge wie man sieht.
Hier mein bisheriger Quelltext:
[JAVA=0]
package Sort;
import java.util.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.Comparator;
public class Sortierens
{
public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub
String[][] liste = new String[0][0];
int rows = 0, cols = 0;
FileInputStream csvstream;
InputStreamReader csvreader;
BufferedReader CSVFile;
try {
String b = "worldcitiespop.txt"; //File location
csvstream = new FileInputStream("C:/Users/synapsenspalt/Documents/JAVA/sUche/bin/"+b); //Datei wird eingelesen
csvreader = new InputStreamReader(csvstream);
CSVFile = new BufferedReader(csvreader);
String dataRow;
while ((dataRow = CSVFile.readLine()) != null){
String[] hilfsarray = dataRow.split(","); //Filtere die Städte heraus, welche eine Bevölkerungszahl haben
if(hilfsarray[4].length() > 0) //erhalte dadurch erforderliche größe unseres Arrays
{
++rows ;
cols = dataRow.split(",").length;
}
else
{
cols = dataRow.split(",").length;
}
}
int l=0; //schließe Input aus CSV-File
CSVFile.close();
System.out.println(rows);
liste = new String[rows][cols];
csvstream = new FileInputStream("C:/Users/synapsenspalt/Documents/JAVA/sUche/bin/"+b);
csvreader = new InputStreamReader(csvstream);
CSVFile = new BufferedReader(csvreader);
while ((dataRow = CSVFile.readLine()) != null )
{
String[] hilfsarray2 = dataRow.split(","); //lese CSV-File in Array ein
if(hilfsarray2[4].length() > 0)
liste[l++] = dataRow.split(",");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // Read next line of data.
Arrays.sort(liste, new Comp(4));
int uebergabe = 20;
for(String[] line:liste) {
System.out.println(line[2]+"("+line[0]+")"+"........"+line[4]);
if(--uebergabe <=0) break;
}
}
}
class Comp implements Comparator<String[]> // Sortierklasse, da ich Strings vergleiche muss ich
{ // um Arrays.sort() verwenden zu können Vergleichskriterien festlegen
private int spalte;
public Comp (int spalte){ //verglichen wird die Bevölkerungszahl, somit die 5. Spalte der CSV
this.spalte = spalte;
}
public int compare(String[] s1, String[] s2) //liefert die oben genannten Ergebnisse
{
if( (s1[this.spalte]).length()<(s2[this.spalte].length() )) return 1;
if( (s1[this.spalte]).length()>(s2[this.spalte].length() )) return -1;
return 0;
}
//LIEFERN EBENFALLS NICHTS BRAUCHBARES:
//public int compare(String[] s1, String[] s2) {
// return s1[this.spalte].compareTo(s2[this.spalte]);
// int i = s2[this.spalte].length()-(s1[this.spalte]).length();
// return i;
}
[/code]
Würde mich freuen wenn mir jemand einen Tipp geben könnte!
Vorab schonmal ein großes Dankeschön,
Cheers
Anbei noch der Quelltext als Datei.
Eine CSV-Datei einlesen, großer Datensatz(150mb); Inhalt: Country Code char(2),ASCII City Name varchar(100), City Name varchar(255),State/Region char(2),Population unsigned int, Latitude numeric (float)Longitude numeric (float), 3.3Millionen Städte.
-->soweit kein Problem. über buffered file reader eingelesen in ein Array. Collectionklassen dürfen nicht verwendet werden.
Ausgegeben werden sollen die 20 bevölkerungsreichsten Städte, optional soll die Zahl durch Kommandozeilenparameter variiert werden können.
Momentan sieht die Ausgabe folgendermaßen aus:
47981 //Zahl der Städte mit Bevölkerungszahl
AccentCity(Country)........Population
São Paulo(br)........10021437
Shanghai(cn)........14608512
Bombay(in)........12692717
Delhi(in)........10928270
New Delhi(in)........10928270
Tokyo(jp)........31480498
Seoul(kr)........10323448
Manila(ph)........10443877
Karachi(pk)........11627378
Moscow(ru)........10381288
Dubai(ae)........1137376
Kabul(af)........3043589
Yerevan(am)........1093499
Luanda(ao)........2776125
Cordoba(ar)........1441007
Rosario(ar)........1218497
Vienna(at)........1569315
Adelaide(au)........1074168
Brisbane(au)........1843459
Ich bekomme die Zahlen leider nicht in die Richtige Reihenfolge wie man sieht.
Hier mein bisheriger Quelltext:
[JAVA=0]
package Sort;
import java.util.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.Comparator;
public class Sortierens
{
public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub
String[][] liste = new String[0][0];
int rows = 0, cols = 0;
FileInputStream csvstream;
InputStreamReader csvreader;
BufferedReader CSVFile;
try {
String b = "worldcitiespop.txt"; //File location
csvstream = new FileInputStream("C:/Users/synapsenspalt/Documents/JAVA/sUche/bin/"+b); //Datei wird eingelesen
csvreader = new InputStreamReader(csvstream);
CSVFile = new BufferedReader(csvreader);
String dataRow;
while ((dataRow = CSVFile.readLine()) != null){
String[] hilfsarray = dataRow.split(","); //Filtere die Städte heraus, welche eine Bevölkerungszahl haben
if(hilfsarray[4].length() > 0) //erhalte dadurch erforderliche größe unseres Arrays
{
++rows ;
cols = dataRow.split(",").length;
}
else
{
cols = dataRow.split(",").length;
}
}
int l=0; //schließe Input aus CSV-File
CSVFile.close();
System.out.println(rows);
liste = new String[rows][cols];
csvstream = new FileInputStream("C:/Users/synapsenspalt/Documents/JAVA/sUche/bin/"+b);
csvreader = new InputStreamReader(csvstream);
CSVFile = new BufferedReader(csvreader);
while ((dataRow = CSVFile.readLine()) != null )
{
String[] hilfsarray2 = dataRow.split(","); //lese CSV-File in Array ein
if(hilfsarray2[4].length() > 0)
liste[l++] = dataRow.split(",");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // Read next line of data.
Arrays.sort(liste, new Comp(4));
int uebergabe = 20;
for(String[] line:liste) {
System.out.println(line[2]+"("+line[0]+")"+"........"+line[4]);
if(--uebergabe <=0) break;
}
}
}
class Comp implements Comparator<String[]> // Sortierklasse, da ich Strings vergleiche muss ich
{ // um Arrays.sort() verwenden zu können Vergleichskriterien festlegen
private int spalte;
public Comp (int spalte){ //verglichen wird die Bevölkerungszahl, somit die 5. Spalte der CSV
this.spalte = spalte;
}
public int compare(String[] s1, String[] s2) //liefert die oben genannten Ergebnisse
{
if( (s1[this.spalte]).length()<(s2[this.spalte].length() )) return 1;
if( (s1[this.spalte]).length()>(s2[this.spalte].length() )) return -1;
return 0;
}
//LIEFERN EBENFALLS NICHTS BRAUCHBARES:
//public int compare(String[] s1, String[] s2) {
// return s1[this.spalte].compareTo(s2[this.spalte]);
// int i = s2[this.spalte].length()-(s1[this.spalte]).length();
// return i;
}
[/code]
Würde mich freuen wenn mir jemand einen Tipp geben könnte!
Vorab schonmal ein großes Dankeschön,
Cheers
Anbei noch der Quelltext als Datei.
Anhänge
Zuletzt bearbeitet: