Java-Fractionnement du texte en tableau sans délimiteur évident


J'ai besoin de diviser chaque ligne de texte dans un tableau à l'aide d'une boucle. Le problème est qu'il n'y a pas de délimiteur évident à utiliser étant donné le formatage du fichier texte (que je ne peux pas changer):

Adam Rippon      New York, NY    77.58144.6163.6780.94
Brandon Mroz     Broadmoor, CO   70.57138.1266.8471.28
Stephen Carriere Boston, MA      64.42138.8368.2770.56
Grant Hochstein  New York, NY    64.62133.8867.4468.44
Keegan Messing   Alaska, AK      61.15136.3071.0266.28
Timothy Dolensky Atlanta, AL     61.76123.0861.3063.78
Max Aaron        Broadmoor, CO   86.95173.4979.4893.51
Jeremy Abbott    Detroit, MI     99.86174.4193.4280.99
Jason Brown      Skokie Value,IL 87.47182.6193.3489.27
Joshua Farris    Broadmoor, CO   78.37169.6987.1783.52
Richard Dornbush All Year, CA    92.04144.3465.8278.52
Douglas Razzano  Coyotes, AZ     75.18157.2580.6976.56
Ross Miner       Boston, MA      71.94152.8772.5380.34
Sean Rabbit      Glacier, CA     60.58122.7656.9066.86
Lukas Kaugars    Broadmoor, CO   64.57114.7550.4766.28
Philip Warren    All Year, CA    55.80113.2457.0258.22
Daniel Raad      Southwest FL    52.98108.0358.6151.42
Scott Dyer       Brooklyn, OH    55.78100.9744.3357.64
Robert PrzepioskiRochester, NY   47.00100.3449.2651.08

Idéalement, j'aimerais que chaque nom de [0] (ou prénom [0] nom [1]), chaque emplacement dans [2] ou aussi dans deux différents indices pour la ville et l'état, et que chaque note dans leur propre index. Pour chaque personne, il y a quatre numéros distincts. Comme par exemple celui d'Adam Rippon les scores sont 77.58, 144.61, 63.67, 80.94

Je ne peux pas diviser par espaces car certaines villes ont un espace entre leur nom (comme New York serait alors divisé en New et York dans deux éléments de tableau différents tandis que Broadmoor serait dans un élément). Impossible de diviser les villes par des virgules car Southwest FL n'a pas de virgule. Je ne peux pas non plus diviser les nombres par virgule décimale car ces nombres seraient faux. Alors, y a-t-il un moyen facile de le faire? Comme peut être un moyen de diviser les nombres par le montant de décimales?

Author: sam, 2015-07-13

6 answers

Il semble qu'il y ait une taille fixe pour chaque colonne. Donc dans votre cas, la colonne 1 est de 17 caractères, la deuxième colonne est de 16 caractères de long et le dernier est de 21 caractères.

Maintenant, vous pouvez simplement parcourir les lignes et utiliser la méthode substring(). Quelque chose comme...

String firstColumn = line.substring(0, 17).trim();
String secondColumn = line.substring(17, 33).trim();
String thirdColumn = line.substring(33, line.length).trim();

Pour extraire les nombres, nous pourrions utiliser une expression régulière qui recherche tous les nombres avec deux décimales.

Pattern pattern = Pattern.compile("(\\d+\\.[0-9]{2})");

Matcher matcher = pattern.matcher(thirdColumn);

while(matcher.find())
{
    System.out.println(matcher.group());
}

, Donc dans ce cas - 47.00100.3449.2651.08 renverra

47.00
100.34
49.26
51.08
 7
Author: kevcodez, 2015-07-13 21:21:46

Il semble que chaque colonne ait une taille fixe (nombre de caractères). Comme vous l'avez déjà dit, vous ne pouvez pas diviser par onglets ou espaces en raison de la dernière ligne où il n'y a pas d'onglet ou d'espace entre le nom et la ville.

Je propose de lire une ligne, puis de diviser la chaîne par line.substring(startIndex,endIndex). Par exemple line.substring(0,18) pour le nom (si j'ai compté correctement). Ensuite, vous pouvez diviser ce nom en prénom et nom en utilisant l'espace comme délimiteur.

 1
Author: havogt, 2015-07-13 20:19:46

En supposant que les champs ont une largeur fixe, ce qui semble être le cas, vous pouvez effectuer des opérations de sous-chaîne pour obtenir chaque champ, puis analyser en conséquence. Quelque chose comme:

String name = line.substring(0,x)
String city_state = line.substring(x, y)
String num1 = line.substring(y,z)

Etc. où les x, y et z sont les ruptures de colonne.

 0
Author: John Kuhns, 2015-07-13 20:21:59

Cela semble être le bon vieux format de fichier à position fixe. Il était très populaire à l'époque des lecteurs de cartes perforées.

Donc, fondamentalement, vous de lire ce fichier ligne par ligne, puis:

String name = line.substring(0,17).trim();
String location = line.substring(17,33).trim();

String[] scores = new String[4];
scores[0] = line.substring(33,38);
scores[1] = line.substring(38,44);
scores[2] = line.substring(44,49);
scores[3] = line.substring(49,54);

Vous pouvez ensuite continuer et diviser le nom par espace, l'emplacement par ,, convertir les scores en nombres et ainsi de suite.

Si vous voulez rendre tout ce qui précède plus général, vous pouvez préparer une liste d'index et créer le tableau en fonction de ces index:

int[] fieldIndexes = { 0, 17,33,38,44,49,54 };
String values[] = new String[fieldIndexes.length - 1];

Et puis dans votre lire la boucle (encore une fois, je suppose que vous lisez la ligne dans line):

for ( int i = 1; i < fieldIndexes.length; i++ ) {

     values[i-1] = line.substring(fieldIndexes[i-1],fieldIndexes[i]).trim();

}

Puis passez au travail avec le tableau values.

Bien sûr, assurez-vous que chaque ligne que vous lisez a le nombre approprié de caractères, etc. afin d'éviter les hors-limites des problèmes.

 0
Author: RealSkeptic, 2015-07-13 20:28:34

Lire ligne par ligne, puis dans chaque ligne, sous-chaîne par les limites correspondantes. par exemple:

private static String[] split(String line) {
    return new String[] {
        line.substring(0, 16).trim(),
        line.substring(17, 32).trim(),
        line.substring(33, 37).trim(),
        line.substring(38, 43).trim(),
        line.substring(44, 48).trim(),
        line.substring(49, 53).trim(),
    };
}
 0
Author: Paul Vargas, 2015-07-13 20:30:07

Pourquoi ne pas diviser par index ? Les coordonnées sont délicates, mais si vous avez toujours deux nombres après les décimales, cet exemple peut vous aider.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class Split {

    public static void main(String[] args) throws IOException {

        List<Person> lst = new ArrayList<Split.Person>();

        BufferedReader br = new BufferedReader(new FileReader("c:\\test\\file.txt"));

        try {
            String line = null;

            while ((line = br.readLine()) != null) {

                Person p = new Person();

                String[] name = line.substring(0,17).split(" ");
                String[] city = line.substring(17,33).split(" ");

                p.setName(name[0].trim());
                p.setLastname(name[1].trim());
                p.setCity(city[0].replace(",","").trim());
                p.setState(city[1].replace(",","").trim());

                String[] coordinates = new String[4];
                String coor = line.substring(33);

                String first = coor.substring(0, coor.indexOf(".") + 3);

                coor = coor.substring(first.length());

                String second = coor.substring(0, coor.indexOf(".") + 3);

                coor = coor.substring(second.length());

                String third = coor.substring(0, coor.indexOf(".") + 3);

                coor = coor.substring(third.length());

                String fourth = coor.substring(0, coor.indexOf(".") + 3);

                coordinates[0] = first;
                coordinates[1] = second;
                coordinates[2] = third;
                coordinates[3] = fourth;

                p.setCoordinates(coordinates);

                lst.add(p);
            }

        } finally {
            br.close();
        }

        for(Person p : lst){
            System.out.println(p.getName());
            System.out.println(p.getLastname());
            System.out.println(p.getCity());
            System.out.println(p.getState());
            for(String s : p.getCoordinates()){
                System.out.println(s);
            }

            System.out.println();
        }
    }

    public static class Person {

        public Person(){}

        private String name;
        private String lastname;
        private String city;
        private String state;
        private String[] coordinates;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getLastname() {
            return lastname;
        }
        public void setLastname(String lastname) {
            this.lastname = lastname;
        }
        public String getCity() {
            return city;
        }
        public void setCity(String city) {
            this.city = city;
        }
        public String getState() {
            return state;
        }
        public void setState(String state) {
            this.state = state;
        }
        public String[] getCoordinates() {
            return coordinates;
        }
        public void setCoordinates(String[] coordinates) {
            this.coordinates = coordinates;
        }
    }

}
 0
Author: Hoku, 2015-07-13 20:39:54