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");
}
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.
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());
}
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());
}
}
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();
}
}
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.
Am besten lassen Sie auch eine Bibliothek wie Apache Commons CSV das Lesen und Schreiben erledigen CSV oder Tabulatorgetrennt Dateien.
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() );
}
}