Jak podzielić pobrane zdanie na składniki bez przecinków i cudzysłowów?

0

Mam problem z rozdzieleniem stringa. Pobieram cała linię z pliku do jednego stringa. Linia składa się ze liczb oraz ze słow(ktore są w cudzysłowach) dodatkowo każda liczba oraz słowo jest oddzielone od siebie przecinkiem.
tak wygląda przykładowa pobrana Linijka :
1,"Goroka","Goroka","Papua New Guinea","GKA","AYGA",-6.081689,145.391881,5282,10,"U"

Jakim sposobem takie pobrane całe zdanie rozdzielić na pojedyńcze składniki bez przecinków ani cudzysłowów ?
I każdą pobraną linie chcę wpisywać do wiersza tablicy dwuwymiarowej

2

http://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java
http://stackoverflow.com/questions/2608665/how-can-i-trim-beginning-and-ending-double-quotes-from-a-string

Z tym że nie zupełnie o to chodzi tobie jak mniemam.
Widzę że nie rozumiesz że nie o to ci chodzi: 1,"ala, ma, kota",2,"jakiś teks a w nim ""coś"" w cudzysłowach",3

Poszukaj gotowej biblioteki wczytującej csv lub zrób samodzielnie podział, wczytujesz znak po znaku , implementujesz maszynę Turinga.

0

Tablica się zupełnie nie nadaje:

  1. Przed odczytaniem pliku nie znasz rozmiaru tablicy.
  2. Po rozdzieleniu Stringa, różne jego fragmenty maja różny typ. Nie da się sensownie zadeklarować typu tej dwuwymiarowej tablicy.
0

Próbowałem właśnie funkcją "split" rozdzielać to zostawały cudzysłowy i nie wiem znowu jak się ich pozbyć

0

jak nie do tablicy to do ArrayList ?
Tylko w jaki sposób? Każdej linijce tworzyć osobny ArrayList?

1

Nie, tworzysz jedną kolekcję typu ArrayList<Lotnisko>, a na podstawie każdego wiersza (po jego analizie) tworzysz obiekt typu Lotnisko i dodajesz kolekcji.

0

Czyli np
Tworze sobie klase Lotnisko gdzie tworze sobie zmienne opisujące każde lotnisko. Tworze obiekt typu Lotnisko ,a następnie przypisuje do zmiennych dane pobrane z każdej pobranej linii tekstu I potem tak utworzony obiekt dodaje do kolekcji ?

Tylko czy istnieje jakiś prosty sposób do rozdzielenia tego stringa ?

0

Jeśli chodzi o klasę Lotnisko to prawie się zgadzam. Ja bym napisał w tej klasie konstruktor, który przyjmuje cały niepodzielony String i na jego podstawie tworze zmienne. Musisz zadecydować jak interpretować \N, które występuje w miejscu piątego cudzysłowu.
Podział powinien być prosty, bo chyba nigdzie nie ma przecinków i cudzysłowów wewnątrz cudzysłowu. split(",") i replace("""."").

0

Pojawia się problem z podziałem, niektóre stringi posiadają przecinki i caly podział sie wysypuje ;/

1

Kod został napisany na szybko i nie testowałem go na tyle, żeby napisać, że działa w stu procentach. Także warto pomyśleć nad optymalizacją jego.

import java.util.ArrayList;


public class HelloWorld 
{

  public static void main(String[] args) 
  {
    ArrayList<String> list = new ArrayList<String>();

    // pobieranie wartości i dzielenie ich na linijki 
    String line = "1,\"Goroka\",\"Goroka\",\"Papua New Guinea\",\"GKA\",\"AYGA\",-6.081689,145.391881,5282,10,\"U\", \"Test, test\"";

    String entry   = "";
    Boolean string = false;

    int i = 0, size = line.length();
    while (i < size) {
      char current = line.charAt(i);
      if (!string && current == ',') {
        list.add(entry);
        entry = "";
      } else if (current == '"') {
        string = !string;
      } else if (current == ' ' && !string) {
        // pomiń białe znaki, jeśli nie są one w tekście 
      } else {
        entry += current;
      }
      i++;
    }
    list.add(entry);

    for (String element : list) {
      System.out.println(element);
    }
  }

}
1

Krok pierwszy split + remove:

String line = "1,\"Goroka\",\"Goroka\",\"Papua New Guinea\",\"GKA\",\"AYGA\",-6.081689,145.391881,5282,10,\"U\", \"Test, test\"";
String[] lineElements = line.split(",");

for (int i = 0; i < lineElements.length; i++) {
        String lineElement = lineElements[i];
        // zamiana w miejscu!!!!
        lineElements[i] = lineElement.replaceAll("\"", "");
}

Krok drugi masz już tablicę "gołych" stringów zatem piszesz parser zamieniający tablicę stringów na konkretny obiekt.

1

Dokładnie tak samo jak powyższy kod zadziała:

String line = "1,\"Goroka\",\"Goroka\",\"Papua New Guinea\",\"GKA\",\"AYGA\",-6.081689,145.391881,5282,10,\"U\", \"Test, test\"";
String[] lineElements = line.replaceAll("\"","").split(",");
0

String mam w takiej postaci :
1,"Goroka","Goroka","Papua New Guinea","GKA","AYGA",-6.081689,145.391881,5282,10,"U"
a nie w takiej :
String line = "1,\"Goroka\",\"Goroka\",\"Papua New Guinea\",\"GKA\",\"AYGA\",-6.081689,145.391881,5282,10,\"U\", \"Test, test\"";
i jak z takiego czegoś usunąć cudzysłów ?
Próbowałem tą metodą :

lineElements[i] = lineElement.replaceAll("\"", "");

ale cudzysłowy dalej są.

0

Moja zmienna i tekst, który ty zamieściłeś jest taki sam (oprócz tego dopisku na końcu, który miał służyć wyłącznie do testów). Ten znak " jest znakiem specjalnym, który kompilator tłumaczy na zwykły cudzysłów.

0

Używam takiego czegoś:

zdanie=in.nextLine();
			zdanie.replaceAll("\"", "");
			System.out.println(zdanie);

i pobrany string dalej ma cudzysłowy ;/

1
zdanie = in.nextLine();
zdanie = zdanie.replaceAll("\"", "");
System.out.println(zdanie);
0

o boże taki błąd :D
Dzięki, nie zauważyłem :D

0
Jonywalker napisał(a):

... a nie w takiej :
String line = "1,\"Goroka\",\"Goroka\",\"Papua New Guinea\",\"GKA\",\"AYGA\",-6.081689,145.391881,5282,10,\"U\", \"Test, test\"";

Zacznij od wyświetlenia tego line

Jonywalker napisał(a):

... i jak z takiego czegoś usunąć cudzysłów ?
Próbowałem tą metodą :

lineElements[i] = lineElement.replaceAll("\"", "");

Chrzani waść.

http://ideone.com/VmUaON

1 użytkowników online, w tym zalogowanych: 0, gości: 1