2012-12-11 13 views
7

Czytam długi szereg informacji z pliku tekstowego, który wygląda dokładnie tak:Przeczytaj plik tekstowy jednej linii, Split do tablicy

Sebastien 5000\\Loic 5000\\Shubhashisshh 5000\\Thibaullt 5000\\Caroo 5000\\Blabla 5000\\Okayyy 5000\\SebCed 5000\\abusee 5000\\omg 5000\\

To ma być wysokie wyniki z nazwiskami użytkowników. Kiedy wydrukować linię, wygląda dokładnie tak jak powinien, ale kiedy wydrukować tablicę po użyciu split("\\\\"), wygląda to tak:

[Sebastien 5000, , Loic 5000, , Shubhashisshh 5000, , Thibaullt 5000, , Caroo 5000, , Blabla 5000, , Okayyy 5000, , SebCed 5000, , abusee 5000, , omg 5000]

Problemem jest to, że Array[0] jest w porządku, ale Array[1] jest pusty , podobnie jak Array[3], Array[5], itp.

Oto mój kod. Co jest z tym nie tak?

  BufferedReader in = null; 
    try { 
     in = new BufferedReader(new FileReader(path)); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    String line = null; 
    try { 
     line = in.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("LINE = "+line); 

    String[] scores = line.split("\\\\"); 

    System.out.println("Mode = "+mode+Arrays.toString(scores)); 
+0

Używasz 'line.split ("\\\\");' lub jest to, że literówka? Myślę, że potrzebujesz 'linii.split ("\\\"); ' – NickD

+1

@NickD to wymaga regex, więc potrzebujesz' "\\\\" ', który najpierw staje się dosłownym ciągiem' '\\' ', a następnie regex dla literału' ' \ "'. '" \\\ "' nie kompiluje się, ponieważ jest nieokreślonym ciągiem literowym. – Esailija

+0

To nie jest literówka, ponieważ musisz uciec \ "\" na specjalny znak i drugi raz, ponieważ jest to ciąg znaków, jeśli chcę podzielić \\ muszę użyć \\\\ nie? – user1895293

Odpowiedz

9

To dlatego "\\\\" jest analizowany jako \\ i split method używa wyrażenia regularnego, tak \\ staje \, następnie Sebastien 5000\\Loic 5000 spowoduje [Sebastien 5000,,Loic 5000]

Czy to zamiast: "\\\\\\\\"

+0

Moje przemyślenia ... –

+0

Wielkie dzięki:) Nigdy bym tego nie odkrył: p – user1895293

0

bym poszły o krok dalej niż Nick:

line.split("\\\");

Ten widok zakłada, że ​​próbujesz podzielić linię w każdym punkcie, w którym pojawia się podwójny ukośnik - wygląda na to, że Twój kod dzieli się na każdy dodatkowy podwójny ukośnik, co wyjaśniałoby podwójne przecinki między nazwami ; dlatego pomiędzy każdą podzieloną częścią (tj. każdą z sekcji między przecinkami, są dwa wpisy zamiast jednego, tak, że jeden wpis jest po prostu przecinkiem sam). Sprawdź, czy to działa - Powodzenia!

M.

+0

"\\" w java jest faktycznie pojedynczym ukośnikiem, a dla regexp jest to znak ucieczki, więc "\\\\ "oznacza pojedynczy ukośnik w wyrażeniu regularnym – hoaz

3

Tak dla zabawy, poza rozwiązaniem José Roberto, można również korzystać z niektórych alternatywnych wyrażeń (i mnóstwo innych):

dwóch kolejnych backslashy (ten sam, który w Jose, ale za pomocą kwantyfikatora) :

String[] scores = line.split("\\\\{2}"); 

Dwa kolejne Non-word Postacie:

String[] scores = line.split("\\W{2}"); 

dwóch kolejnych znaków interpunkcyjnych:

String[] scores = line.split("\\p{Punct}{2}"); 

Wszystkie z nich produkować wymaganej wydajności.

Aby uzyskać więcej informacji na temat wyrażeń regularnych w Java: