2015-05-07 2 views
0

Я пытаюсь прочитать .txt-файл в java и создать список списков, чтобы поместить каждую строку этого .txt в другой список. Для каждого файла, который я пытался сделать, все было хорошо, но с файлом facebook_combined.txt.gz, который находится на этом link, он не делает это правильно. Пример:Чтение .txt-файла в строке java строки по строке

, если первая строка другого текстового файла, как это 52 99 45 61 70 45, а второй, как это 70 80 65 91 тогда мой код должен создать список списков названных линий и линий должны быть такими:

line=[[52,99,45,61,70,45][70,80,65,91]]. 

Но для файла facebook_combinded.txt, если мы предположим, что его первая линия, как этот 0 10 20 30 40 50 тот же код создает список списков строк, как это:

lines=[[0,1][0,2][0,3][0,4][0,5][0,...]]. 

код я использую ниже:

ArrayList<ArrayList<String>> lines = new ArrayList<ArrayList<String>>(); 

//read the file 
FileInputStream fstream = new FileInputStream("C:\\Users\\facebook_combined.txt"); 
DataInputStream in = new DataInputStream(fstream); 
BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

while (true)//while the file was read 
{ 
    String line = br.readLine();//split the file into the lines 
    if (line == null) 
    { 
     break;//if there are no more lines left 
    } 

    Scanner tokenize = new Scanner(line);// split the lines into tokens and make into an arraylist 
    ArrayList<String> tokens = new ArrayList<String>(); 

    while (tokenize.hasNext()) //while there are still more 
    { 
     tokens.add(tokenize.next()); 
    } 
    lines.add(tokens); 
} 
    br.close(); 
+0

Вы можете использовать 'Files.readAllLines (yourFilePath)' решить проблему. ([link] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#readAllLines-java.nio.file.Path-)) –

+0

спасибо, но это не так Работа. Он возвращает мне снова список, подобный этим линиям = [[0,1] [0,2] [0,3] [0,4] [0,5] [0, ...]]. – lostromos

ответ

2

Я скачал набор данных и извлекается текстовый файл с 7Zip, и это выглядит как программа работает. Когда вы извлекаете файл, данные выглядят примерно так (используя Notepad ++). , ,

0 1 
0 2 
0 3 
0 4 
0 5 
0 6 
0 7 
0 8 
...etc... 

Я открыл файл с обычным Блокнотом и возврат каретки не видны, так что может быть причиной путаницы (то есть данные выглядит 0 10 20 30 40... в блокноте)


EDIT: Обновлено Пояснение

В ответ на OP

Вы правы на пути, что вот данные хорошо, как в блокноте ++, но правая версия 0 10 20 30

Я не уверен, что это правильно. Опасайтесь Occam's Razor, вы считаете, что данные должны анализироваться 0 10 20 30, хотя файл предоставляет очень явные возвращения каретки. Если файл не должен был иметь возврат каретки, он бы не имел их. Точно так же это не является ошибкой в ​​форматировании файла, так как формат последовательно представляет собой пару чисел, за которыми следует возврат каретки. Существует ничего указывающего на данных, обрабатывается как 0 10 20 30 40 . . .

Файл facebook_combined.txt выглядит список ребер в графе, где каждое ребро является дружба между двумя людьми.

Похоже, вы пытаетесь прочитать «круги» друзей, где круг представляет собой список чисел. Если вы загружаете другой tar-файл «facebook.tar», есть несколько файлов с расширениями * .circles. Вот фрагмент из одного из этих файлов.

circle0 71 215 54 61 298 229 81 253 193 97 264 29 132 110 163 259 183 334 245 222 
circle1 173 
circle2 155 99 327 140 116 147 144 150 270 
circle3 51 83 237 
circle4 125 344 295 257 55 122 223 59 268 280 84 156 258 236 250 239 69 
circle5 23 
circle6 337 289 93 17 111 52 137 343 192 35 326 310 214 32 115 321 209 312 41 20 

Эти файлы * .circles выглядят в том же формате, в котором вы ожидаете (список номеров цифр).

+0

То же самое здесь –

+0

Вы правы для того, как данные выглядят как в блокноте ++, но в правильной версии 0 10 20 30 – lostromos

+0

Каким образом данные должны интерпретироваться? Это, как предполагается, график друзей в Facebook, правильно? Тогда 0 1 будет дружбой между человеком 0 и человеком 1. Тогда 0 2 будет дружбой между человеком 0 и человеком 2. И т. Д. Как вы интерпретируете данные [0 10 20 30 40 ...] как график друзья? – FriedSaucePots

0

Я думаю, что ваш код является неправильным. Обычно я не использую «Сканер». Но, может быть, вы можете использовать.сплит()

Я не люблю «а (истина)» петли, так что я рекомендую изменения, которые к этому:

String s; 
while ((s = br.readLine()) != null) { 

и удалит:

String line = br.readLine();//split the file into the lines 
if (line == null) 
{ 
    break;//if there are no more lines left 
} 

попытайтесь использовать сплит-то как это:

String[] tokenize = line.split(" "); 
ArrayList<String> tokens = new ArrayList<String>(); 
for(String s : tokenize){ 
tokens.add(s); 
} 
+0

хороший момент, но проблема остается. – lostromos

+0

Я только что написал еще один ответ 1 час назад, это работает? –

+0

спасибо, но это не помогает, и я склонен полагать, что файл является проблемой, а не тем, как я управляю им. – lostromos

0

Ну, вы просто сказать, что на самом деле .txt файл выглядит

0 1 
0 2 
0 3 
0 4 
0 5 
0 6 
0 7 
0 8 

но вам это нужно, как

0 10 20 30 40 50 

Так я думаю, что вы должны прочитать все файлы, а затем заменить каретка возвращается

+0

Я не могу понять вашу идею, что вы имеете в виду, заменив возврат каретки? – lostromos

+0

Да, с методом .replace ("", ""). Вы можете увидеть больше информации здесь: http://stackoverflow.com/questions/2163045/how-to-remove-line-breaks-from-a-file-in-java Теперь вы узнаете, как их заменить. Если вы не понимаете, дайте мне знать, пожалуйста. –

Смежные вопросы