Вопрос по io, java, string – Как я могу прочитать значения через запятую из текстового файла в Java?

7

У меня есть этот текстовый файл со значениями широты и долготы разных точек на карте.

Как я могу разбить мою строку на широту и долготу? Каков общий способ делать подобные вещи с другими разделителями, такими как пробел, табуляция и т. Д.? Образец файла:

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");
}
OpenCSV - популярная библиотека, если вы предпочитаете ее использовать. Подробности здесь:opencsv.sourceforge.net Есть также несколько других вопросов о стеке потока на похожую тему:stackoverflow.com/questions/101100/csv-api-for-java - stackoverflow.com/questions/200609/… Leon

Ваш Ответ

6   ответов
4

ться для подобных вещей. Вот фрагмент из моей собственной программы, это довольно просто. Я проверяю, был ли задан символ-разделитель, и использую его, если он есть, если нет, я использую значение по умолчанию в 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());
}
0

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

//lat=3434&lon=yy38&rd=1.0&| в этом формате o / p отображает

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

Вы можете использоватьString.split() метод:

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

После этого используйтеDouble.parseDouble() метод для анализа строкового значения в двойном

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

Подобные методы разбора существуют и в других классах-обёртках -Integer, Boolean, так далее.

Большое спасибо. Работал как шарм. rishiag
@ AVD: Я полагаю, что было предоставлено решение для чтения значений, разделенных запятыми, из текстового файла. Что это не делает правильно. При чтении он не читает первые значения в этом текстовом файле. столкнуться с проблемами без необходимости. Это была причина, чтобы поднять это через комментарий.
@ratchetfreak Будет иметь это в виду. Большое спасибо. rishiag
@Downvoter - Пожалуйста, добавьте комментарий!
@ user1425223 обратите внимание, чтоString.split принимает регулярное выражение, и если вы хотите, чтобы ничего смешного не произошло (как с. или же|) вы можете сначала пропустить разделитель черезPattern.quote(): str.split(Pattern.quote(".")) (или избежать этого вручную)
1

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");
    }
0
Use BigDecimal, not double

Ответ от adatapost правильно об использованииString::split но неправильно об использованииdouble представлять ваши значения долготы-широты.float/Float а такжеdouble/Double типы использованиятехнология с плавающей точкой которыйменяет точность за скорость исполнения.

Вместо этого используйтеBigDecimal чтобы правильно представить ваши лат-длинные значения.

Use Apache Commons CSV library

Кроме того, лучше всего позволить библиотеке, такой какApache Commons CSV выполнять работу по чтению и письмуCSV или жеВкладка разделителями файлы.

Example app

Вот полный пример приложения, использующего этоCommons CSV библиотека. Это приложение пишет, а затем читает файл данных. Оно использует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() );
    }

}
Вероятно, достаточно четырнадцати десятичных знаков & # x2026;gis.stackexchange.com/a/8674

Похожие вопросы