it-swarm.com.de

Wie kann ich kommagetrennte Werte aus einer Textdatei in Java lesen?

Ich habe diese Textdatei mit Breiten- und Längenwerten verschiedener Punkte auf einer Karte.

Wie kann ich meine Zeichenfolge in Breiten- und Längengrade aufteilen? Was ist der allgemeine Weg, um diese Art von Dingen zu tun, die mit anderen Begrenzern wie Leerzeichen oder Tabulatoren usw. verbunden sind? Beispieldatei:

28.515046280572285,77.38258838653564
28.51430151808072,77.38336086273193
28.513566177802456,77.38413333892822
28.512830832397192,77.38490581512451
28.51208605426073,77.3856782913208
28.511341270865113,77.38645076751709

Dies ist der Code, den ich verwende, um aus der Datei zu lesen:

try(BufferedReader in = new BufferedReader(new FileReader("C:\\test.txt"))) {
    String str;
    while ((str = in.readLine()) != null) {
        System.out.println(str);
    }
}
catch (IOException e) {
    System.out.println("File Read Error");
}
6
rishiag

Sie können die Methode String.split() verwenden:

String[] tokens = str.split(",");

Verwenden Sie anschließend die Methode Double.parseDouble() , um den String-Wert in ein Double zu parsen.

double latitude = Double.parseDouble(tokens[0]);
double longitude = Double.parseDouble(tokens[1]);

Ähnliche Analysemethoden gibt es auch in den anderen Wrapper-Klassen - Integer, Boolean usw.

26
adatapost

Verwenden Sie OpenCSV für Zuverlässigkeit. Split sollte niemals für diese Art von Dingen verwendet werden. Hier ist ein Ausschnitt aus einem eigenen Programm, es ist ziemlich einfach. Ich überprüfe, ob ein Trennzeichen angegeben wurde, und verwende dieses, falls dies der Fall ist. Wenn nicht, verwende ich den Standard in OpenCSV (ein Komma). Dann las ich den Header und die Felder

CSVReader reader = null;
try {
    if (delimiter > 0) {
        reader = new CSVReader(new FileReader(this.csvFile), this.delimiter);
    }
    else {
        reader = new CSVReader(new FileReader(this.csvFile));
    }

    // these should be the header fields
    header = reader.readNext();
    while ((fields = reader.readNext()) != null) {
        // more code
    }
catch (IOException e) {
    System.err.println(e.getMessage());
}
4

Um Ihren String durch Kommas (,) zu teilen, verwenden Sie str.split(",") und für Tabs verwenden Sie str.split("\\t").

    try {
        BufferedReader in = new BufferedReader(
                               new FileReader("G:\\RoutePPAdvant2.txt"));
        String str;

        while ((str = in.readLine())!= null) {
            String[] ar=str.split(",");
            ...
        }
        in.close();
    } catch (IOException e) {
        System.out.println("File Read Error");
    }

//lat=3434&lon=yy38&rd=1.0&| in diesem Format wird o/p angezeigt

public class ReadText {
    public static void main(String[] args) throws Exception {
        FileInputStream f= new FileInputStream("D:/workplace/sample/bookstore.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(f));
        String strline;
        StringBuffer sb = new StringBuffer();
        while ((strline = br.readLine()) != null)
        {
            String[] arraylist=StringUtils.split(strline, ",");
            if(arraylist.length == 2){
                sb.append("lat=").append(StringUtils.trim(arraylist[0])).append("&lon=").append(StringUtils.trim(arraylist[1])).append("&rt=1.0&|");

            } else {
                System.out.println("Error: "+strline);
            }
        }
        System.out.println("Data: "+sb.toString());
    }
}
0
mrunal bankar

Sie können auch die Java.util.Scanner-Klasse verwenden.

private static void readFileWithScanner() {
    File file = new File("path/to/your/file/file.txt");

    Scanner scan = null;

    try {
        scan = new Scanner(file);

        while (scan.hasNextLine()) {
            String line = scan.nextLine();
            String[] lineArray = line.split(",");
            // do something with lineArray, such as instantiate an object
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        scan.close();
    }
}
0
modle13

Benutze BigDecimal, nicht double

Das Answer by adatapost ist richtig für die Verwendung von String::split aber falsch über die Verwendung von double, um Ihre Längengrad-Breitengrad-Werte darzustellen. Die Typen float/Float und double/Double verwenden Gleitkomma-Technologie wobei Genauigkeit verhandelt für die Geschwindigkeit der Ausführung.

Verwenden Sie stattdessen BigDecimal , um Ihre Lat-Long-Werte korrekt darzustellen.

Benutze Apache Commons CSV Bibliothek

Am besten lassen Sie auch eine Bibliothek wie Apache Commons CSV das Lesen und Schreiben erledigen CSV oder Tabulatorgetrennt Dateien.

Beispiel App

Hier ist eine vollständige Beispiel-App, die die Commons CSV Bibliothek verwendet. Diese App schreibt und liest dann eine Datendatei. Es verwendet String::split für das Schreiben. Und die App verwendet BigDecimal -Objekte, um Ihre Lat-Long-Werte darzustellen.

package work.basil.example;

import org.Apache.commons.csv.CSVFormat;
import org.Apache.commons.csv.CSVPrinter;
import org.Apache.commons.csv.CSVRecord;

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.math.BigDecimal;
import Java.nio.charset.StandardCharsets;
import Java.nio.file.Files;
import Java.nio.file.Path;
import Java.nio.file.Paths;
import Java.time.Instant;
import Java.util.List;
import Java.util.concurrent.ThreadLocalRandom;

public class LatLong
{
    //----------|  Write  |-----------------------------
    public void write ( final Path path )
    {
        List < String > inputs =
                List.of(
                        "28.515046280572285,77.38258838653564" ,
                        "28.51430151808072,77.38336086273193" ,
                        "28.513566177802456,77.38413333892822" ,
                        "28.512830832397192,77.38490581512451" ,
                        "28.51208605426073,77.3856782913208" ,
                        "28.511341270865113,77.38645076751709" );

        // Use try-with-resources syntax to auto-close the `CSVPrinter`.
        try ( final CSVPrinter printer = CSVFormat.RFC4180.withHeader( "latitude" , "longitude" ).print( path , StandardCharsets.UTF_8 ) ; )
        {
            for ( String input : inputs )
            {
                String[] fields = input.split( "," );
                printer.printRecord( fields[ 0 ] , fields[ 1 ] );
            }
        } catch ( IOException e )
        {
            e.printStackTrace();
        }
    }

    //----------|  Read  |-----------------------------
    public void read ( Path path )
    {
        // TODO: Add a check for valid file existing.

        try
        {
            // Read CSV file.
            BufferedReader reader = Files.newBufferedReader( path );
            Iterable < CSVRecord > records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
            for ( CSVRecord record : records )
            {
                BigDecimal latitude = new BigDecimal( record.get( "latitude" ) );
                BigDecimal longitude = new BigDecimal( record.get( "longitude" ) );
                System.out.println( "lat: " + latitude + " | long: " + longitude );
            }
        } catch ( IOException e )
        {
            e.printStackTrace();
        }
    }

    //----------|  Main  |-----------------------------
    public static void main ( String[] args )
    {
        LatLong app = new LatLong();

        // Write
        Path pathOutput = Paths.get( "/Users/basilbourque/lat-long.csv" );
        app.write( pathOutput );
        System.out.println( "Writing file: " + pathOutput );

        // Read
        Path pathInput = Paths.get( "/Users/basilbourque/lat-long.csv" );
        app.read( pathInput );

        System.out.println( "Done writing & reading lat-long data file. " + Instant.now() );
    }

}
0
Basil Bourque