Wie konvertiere ich Werte in einer CSV Datei in Java zu einem Integer, aber erst ab der zweiten Zeile?


01.11.2020, 23:11

Der Code bis jetzt: https://pastebin.com/L5WQi7t4

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

ich hab nicht ganz verstanden was du vor hast, aber ne lösung hätte ich denke ich.

du lässt ne for schleife über die liste laufen mit dem wert i besipielsweise und in der for schleife macht du ne if anweisung wo du sagst if i != 0.

so überspringst du den String und machst ab den zahlen weiter


0TAAN0 
Beitragsersteller
 01.11.2020, 22:35

Nein noch immer der gleiche Fehler meintest du so in etwa?

    for(int i=0; i<s.length();i++) {

    if (i !=0)

    i= Integer.parseInt(s);

     }

(Fehlermeldung: For input string: "Daten" )

pentihunter  01.11.2020, 22:36
@0TAAN0

du musst if (i!=0) nehmen. Die Schleife fängt doch bei 0 an.

0TAAN0 
Beitragsersteller
 01.11.2020, 22:37
@pentihunter

eine Schleife fängt bei 0 an aber eine CSV datei auch? Und ja habs mit 0 auch versucht geht nicht, gleicher Fehler

pentihunter  01.11.2020, 22:38
@pentihunter
for(int i=0; i<s.length();i++) {
  if (i!=0){
    i= Integer.parseInt(s);
  }
}
pentihunter  01.11.2020, 22:39
@pentihunter

Hast du die if anweisung auch wie bei meinem beiospiel in eine geschweifte klammer gepackt. So wie du es geschrieben hast hat sie gefehlt

pentihunter  01.11.2020, 22:44
@pentihunter

übrigens ich habe dein code nur kopiert, aber mir fällt was auf.

i= Integer.parseInt(s); macht irgentwie kein sinn.

wieso solltest du i zu der zahl umwandeln und du müsstest doch s[i] nehmen um die richtige stelle der liste anzusteuern

pentihunter  01.11.2020, 22:48
@pentihunter

System.out.println(Integer.parseInt(s[i])) würde die zahlen als int ausgeben. Ob du die in den gleichen array packen kannst weis ich nicht. kenn mich mit java nicht aus gut aus. Also notfalls nen neuen array erstellen wo du dann nur die zahlen reinpackst um damit zu arbeiten. Den arrays nehmen eigentlich keine gemischten datenformen. entweder strings oder Integer

mein tip : ASCII Code nutzen und gucken ob es eine zahl ist , dann parseInt , ansonsten halt nix machen und weiter in der schleife .

du könntes auch gucken ob parseInt ein ergebnis wirft was eben bedeutet , keine Zahl gefunden .


0TAAN0 
Beitragsersteller
 01.11.2020, 23:02

Danke für deine Antwort, kommt aber halt diese Fehlermeldung raus "java.lang.NumberFormatException: For input string: "Number"" wenn ich parseInt benutze und ja es sind Zahlen und keine Double oder float Werte habe es mit einer Schleife im Code versucht(habs eingefügt) https://pastebin.com/L5WQi7t4

Beim Einlesen der Datei musst du eigentlich nur die erste Zeile überspringen.

Pseudocode:

for (row = 0, hasline(), ++row):
  line = readline()
  
  if row = 0:
    continue

  # parse ...            

0TAAN0 
Beitragsersteller
 01.11.2020, 23:24

Habe versucht den Code einzufügen, hat aber noch nicht geklappt, ich habe den Code zu meiner Frage hinzugefügt könntest du mir da zeigen wo genau ich es machen soll? Denn ich habe sowas ähnliches schon dort

regex9  01.11.2020, 23:59
@0TAAN0

Mhm, ich überlege gerade, ob ich mir in Zukunft nicht auch die Mühe sparen, und einfach alles unformatiert hier hineinklatschen sollte. 😐

So wie ich das sehe, liest du deine CSV-Datei doppelt und dreifach ein. Einmal via Spark und dann nochmal pro Zeile komplett neu. Es erweckt für mich den Anschein, dass du selbst überhaupt nicht weißt, was dein Code tut. Er sollte eigentlich wirklich (am besten komplett) überarbeitet werden.

Deine Schleife in Zeile 37 durchläuft jede Zeile deiner Datei zeichenweise und versucht, jedes Zeichen in eine Zahl zu konvertieren. Das ist sicherlich nicht das, was du beabsichtigt hast. Stattdessen soll ja einfach nur die erste Zeile ignoriert werden.

Bei Nutzung eines Lambdas / einer anonymen Klasse brauchst du den Zähler außerhalb der Klasse / des Methodenkörpers. So wie bei einer Schleife: Der Zähler befindet sich außerhalb des Code-Blocks, welcher einen Iterationsschritt definiert. Er hat also eine Lebenszeit, die über alle Schleifenwiederholungen hinausgeht.

Da eine lokale Variable innerhalb eines solchen Blocks aber nicht so einfach verwendet werden darf, kannst du keinen int-Typ verwenden, dafür aber eine AtomicInteger-Instanz.

Das Snippet ist wieder nur exemplarisch:

AtomicInteger lineNumber = new AtomicInteger(0);

allLines.filter(new Function<String, Integer>() {
  if (lineNumber.incrementAndGet() == 1) {
    return false;
  }

  // parse ...
});