10
votes

Comment puis-je lire des valeurs séparées par des virgules d'un fichier texte en Java?

J'ai ce fichier texte avec des valeurs de latitude et de longitude de différents points sur une carte.

Comment puis-je diviser ma chaîne en latitudes et longitudes? Quelle est la manière générale de faire ce type de choses qui sont avec d'autres délimiteurs comme espace ou tabulation, etc.? Exemple de fichier: xxx

Ceci est le code que j'utilise pour lire à partir du fichier: xxx


1 commentaires

OpenCsv est une bibliothèque populaire si vous préférez utiliser cela. Détails ici: OPENCSV.SOURCEFORGE.net Il y a aussi quelques autres questions StackoverFlow sur un sujet similaire: - < Un href = "https://stackoverflow.com/questions/101100/csv-api-for-java"> Stackoverflow.com/questions/101100/csv-api-for-java - Stackoverflow.com/questions/200609/...


6 Réponses :


33
votes

Vous pouvez utiliser le string.split () code> Méthode: xxx pré>

après cela, utilisez double.parsedouble () code> méthode à Analysez la valeur de la chaîne à un double. p>

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


5 commentaires

Merci beaucoup. Travaillé comme un charme.


@ user1425223 Notez que string.split prend une regex et si vous voulez vous assurer que rien de drôle ne se produit (comme avec . ou | | ). Passez le séparateur via motif.Quote () : str.split (motif.quote (".")) (ou échappez-le manuellement)


@AVD :: Avez-vous obtenu la première ligne dans votre fichier texte que vous avez montré ci-dessus? Je ne suis pas capable d'obtenir le contenu de la première ligne ... Reste tout va bien.


@ user3560140 Cet extrait de code explique l'utilisation de la méthode divisée . S'il vous plaît poser une nouvelle question si vous avez des problèmes avec votre code.


@AVD: Je suppose que la solution a été fournie pour lire les valeurs séparées des virgules à partir de fichier texte? Qu'il ne fait pas correctement. En lecture seule, il ne lit pas les premières valeurs dans ce fichier texte.so si quelqu'un l'utilisait comme un exemple Concentrer des problèmes de manière non cessée. Ce fut la raison de la mentionner à travers un commentaire.



4
votes

Utilisez OPENCSV pour la fiabilité. La scission ne doit jamais être utilisée pour ce genre de choses. Voici un extrait d'un programme de miens, c'est assez simple. Je vérifie si un caractère de délimitation a été spécifié et l'utilisez celui-ci s'il est, sinon j'utilise la valeur par défaut dans OpenCSV (une virgule). Ensuite, j'ai lu l'en-tête et les champs xxx


0 commentaires

1
votes

Pour diviser votre chaîne par virgade (,) Utilisez str.split (",") et pour l'onglet Utilisez str.split ("\\ t") < Pré> xxx


0 commentaires

0
votes

// lat = 3434 & lon = yy38 & rd = 1.0 & | code> dans ce format O / P affiche

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 commentaires

0
votes

Vous pouvez également utiliser la classe Java.Util.Scanner. XXX


0 commentaires

1
votes

Utilisez bigdecimal code>, pas double code>

the Réponse par Adatapost a raison d'utiliser String :: Split code> mais faux sur l'utilisation de double code> pour représenter vos valeurs de latitude de longitude. Le float code> / float code> et double code> / double code> Types utilise technologie à point flottant qui Effectuer une précision de l'extérieur pour une vitesse d'exécution. p>

Utilisez plutôt bigdecimal code> pour représenter correctement Vos valeurs lat-longes. P>

Utilisez Apache Commons CSV em> bibliothèque h1>

aussi, mieux pour laisser une bibliothèque telle que Apache Commons CSV em> Effectuez la corvée de la lecture et de l'écriture CSV ou Fichiers délimités par l'onglet "/a>. P>

Exemple App h1>

Voici un exemple d'application complet à l'aide de celui Commons CSV em> bibliothèque. Cette application écrit alors lit un fichier de données. Il utilise String :: Split code> pour l'écriture. Et l'application utilise les objets bigdecimal code> pour représenter vos valeurs lat-longues. P>

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

}


1 commentaires

Quatorze décimaux est probablement suffisant ... gis.stackexchange.com/a/8674