11

マップ上のさまざまなポイントの緯度と経度の値を含むこのテキストファイルを入手しました。

文字列を緯度と経度に分割するにはどうすればよいですか?スペースやタブなどの他の区切り文字を使用して、これらのタイプのことを行う一般的な方法は何ですか?サンプルファイル:

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

これは、ファイルから読み取るために使用しているコードです。

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");
}
4

6 に答える 6

33

String.split()次の方法を使用できます。

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

その後、Double.parseDouble()メソッドを使用して文字列値をdoubleに解析します。

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

同様の解析メソッドが他のラッパークラスにも存在します-、、IntegerなどBoolean

于 2012-06-09T10:29:07.510 に答える
4

信頼性のためにOpenCSVを使用してください。スプリットは、このようなことには決して使用しないでください。これは私自身のプログラムからの抜粋です、それはかなり簡単です。区切り文字が指定されているかどうかを確認し、指定されている場合はこれを使用します。指定されていない場合は、OpenCSVのデフォルト(コンマ)を使用します。次に、ヘッダーとフィールドを読み取ります

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());
}
于 2012-06-09T10:38:47.830 に答える
2

文字列をコンマ(、)で分割するにはstr.split(",")、タブを使用します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");
    }
于 2012-06-09T10:50:46.923 に答える
1

使用するBigDecimal、ではなくdouble

adatapostによる回答は、経度と緯度の値を表すために使用することについては正しいですString::splitが、使用することについては間違っています。/および/タイプはdouble、実行速度と精度を交換する浮動小数点テクノロジーを使用します。floatFloatdoubleDouble

代わりにBigDecimal、緯度経度の値を正しく表すために使用します。

ApacheCommonsCSVライブラリを使用する

また、 Apache Commons CSVなどのライブラリに、CSVまたはタブ区切りファイルの読み取りと書き込みの雑用を実行させるのが最善です。

サンプルアプリ

これは、そのCommonsCSVライブラリを使用した完全なサンプルアプリです。このアプリは、データファイルを書き込んでから読み取ります。String::split書き込みに使用します。また、アプリはBigDecimalオブジェクトを使用して緯度経度の値を表します。

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() );
    }

}
于 2019-03-10T22:13:43.243 に答える
0

//lat=3434&lon=yy38&rd=1.0&|その形式でo/pが表示されています

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());
    }
}
于 2015-08-31T05:32:23.807 に答える
0

java.util.Scannerクラスを使用することもできます。

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();
    }
}
于 2016-05-11T01:36:10.177 に答える