|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
Ёрик : 187 Новичок Откуда: Кисловодск
|
Янв 28, 2012 14:14 |
|
|
Здравствуйте.Мне нужно сделать форматированное чтение из файла.
Формат данных такой:
string string 56 56
string 5 5
string 5 7
string 6 8
string 7 6
string 8 5
ПЫтался сделать это с помощью Scanner - не получилось. Почему-то выбрасывается исключение MismatchException.
Первую строку прочитал успешно:
Сделал skip("str str"), затем nextInt 2 раза. Данные находил (2 int'а).
Затем делал skip("str") и nextInt() выпоняли, доставал первое целочисленное число. А затем выбрасывал исключение. Причем провериял функцией next(), которая возвращает строку. У бедился, что следущий тип - int., но почему-то выбрасывал исключение при вызове nextInt().
Потом вообще каждый раз вызывал next(), чтобы пропустить строку. Но т.к. файл большой (17 мб), хотя структура большая, выскакивало исключение IOException при чтении (13% файла прочитывал и выбрасывал его).
На С проблем нет. Файл считывается успешно, причем там 2 строки sscanf("%s %s %d %d")
цикл
sscanf("%s %d %d")
Как мне прочитать файл с такой структурой? Причем так так, чтобы файл любого размера считывался. |
|
|
|
 |
Vantuz-Subhuman : 660 Постоянный посетитель Откуда: издиснейленда
|
Янв 28, 2012 14:51 |
|
|
| Ёрик писал(а): |
Здравствуйте.Мне нужно сделать форматированное чтение из файла.
Формат данных такой:
string string 56 56
string 5 5
string 5 7
string 6 8
string 7 6
string 8 5
ПЫтался сделать это с помощью Scanner - не получилось. Почему-то выбрасывается исключение MismatchException.
Первую строку прочитал успешно:
Сделал skip("str str"), затем nextInt 2 раза. Данные находил (2 int'а).
Затем делал skip("str") и nextInt() выпоняли, доставал первое целочисленное число. А затем выбрасывал исключение. Причем провериял функцией next(), которая возвращает строку. У бедился, что следущий тип - int., но почему-то выбрасывал исключение при вызове nextInt().
Потом вообще каждый раз вызывал next(), чтобы пропустить строку. Но т.к. файл большой (17 мб), хотя структура большая, выскакивало исключение IOException при чтении (13% файла прочитывал и выбрасывал его).
На С проблем нет. Файл считывается успешно, причем там 2 строки sscanf("%s %s %d %d")
цикл
sscanf("%s %d %d")
Как мне прочитать файл с такой структурой? Причем так так, чтобы файл любого размера считывался. |
Попробуйте делать не "skip("str str"), затем nextInt 2 раза", а 2 раза next(), 2 раза nextInt(). Так у меня всё работает:
Содержимое файла "file":
| Цитата: |
str trs 15 25
qwe 813 334
qazxs 898 214
ewrqerq 515 161
rdfv 899 120
dcvf 46 376
yghfgrt 832 4 |
| Код: |
public static void main(String[] args) {
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
fis = new FileInputStream("file");
isr = new InputStreamReader(fis, "utf8");
br = new BufferedReader(isr);
Scanner sc = new Scanner(br);
System.out.println("line 1.1 :: " + sc.next());
System.out.println("line 1.2 :: " + sc.next());
System.out.println("num 1.3 :: " + sc.nextInt());
System.out.println("num 1.4 :: " + sc.nextInt());
for (int i = 1; sc.hasNext(); i++) {
System.out.println();
System.out.println("\t" + i + " :: line :: " + sc.next());
System.out.println("\t" + i + " :: num1 :: " + sc.nextInt());
System.out.println("\t" + i + " :: num2 :: " + sc.nextInt());
}
} catch (IOException e) {
System.out.println("Error: " + e);
} finally {
close(br);
close(isr);
close(fis);
}
}
private static void close(Closeable c) {
try {
if (c != null) c.close();
} catch (Exception e) {}
} |
Вывод:
| Код: |
line 1.1 :: str
line 1.2 :: trs
num 1.3 :: 15
num 1.4 :: 25
1 :: line :: qwe
1 :: num1 :: 813
1 :: num2 :: 334
2 :: line :: qazxs
2 :: num1 :: 898
2 :: num2 :: 214
3 :: line :: ewrqerq
3 :: num1 :: 515
3 :: num2 :: 161
4 :: line :: rdfv
4 :: num1 :: 899
4 :: num2 :: 120
5 :: line :: dcvf
5 :: num1 :: 46
5 :: num2 :: 376
6 :: line :: yghfgrt
6 :: num1 :: 832
6 :: num2 :: 4 |
_________________ «One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity» |
|
|
|
 |
Ёрик : 187 Новичок Откуда: Кисловодск
|
Янв 29, 2012 13:49 |
|
|
Я так уже делал, и уменя заработало, только файл большой не мог прочитать:
| Цитата: |
| Потом вообще каждый раз вызывал next(), чтобы пропустить строку. Но т.к. файл большой (17 мб), хотя структура большая, выскакивало исключение IOException при чтении (13% файла прочитывал и выбрасывал его). |
Ваш код файл какого размера читает? |
|
|
|
 |
Vantuz-Subhuman : 660 Постоянный посетитель Откуда: издиснейленда
|
Янв 29, 2012 14:16 |
|
|
| Ёрик писал(а): |
Я так уже делал, и уменя заработало, только файл большой не мог прочитать:
| Цитата: |
| Потом вообще каждый раз вызывал next(), чтобы пропустить строку. Но т.к. файл большой (17 мб), хотя структура большая, выскакивало исключение IOException при чтении (13% файла прочитывал и выбрасывал его). |
Ваш код файл какого размера читает? |
Вы какими ридерами пользовались?
Т.к. вот этот код сгенерил файл размером ~34 МБ, а потом нормально его прочитал:
| Код: |
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("file"));
bw.write("strse trsqa 589 6521");
for (int i = 0; i < 2000000; i++) {
bw.newLine();
bw.write(randomString((i & 10) + 2) + " ");
bw.write((int)(Math.random() * 2000) + " ");
bw.write((int)(Math.random() * 2000) + "");
}
bw.close();
} catch (IOException e1) {
e1.printStackTrace();
}
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
fis = new FileInputStream("file");
isr = new InputStreamReader(fis, "utf8");
br = new BufferedReader(isr);
int lines = 0;
int nums = 0;
Scanner sc = new Scanner(br);
sc.next();
sc.next();
lines += 2;
sc.nextInt();
sc.nextInt();
nums += 2;
for (int i = 1; sc.hasNext(); i++) {
System.out.println(i + ": " + sc.next());
lines++;
sc.nextInt();
sc.nextInt();
nums += 2;
}
System.out.println("lines: " + lines);
System.out.println("nums: " + nums);
} catch (IOException e) {
System.out.println("Error: " + e);
} finally {
close(br);
close(isr);
close(fis);
}
}
private static String randomString(int len) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
sb.append((char) (Math.random() * ('z' - 'a') + 'a'));
}
return sb.toString();
}
private static void close(Closeable c) {
try {
if (c != null) c.close();
} catch (Exception e) {}
}
} |
Последние строки вывода:
1999995: ppiqpacyjtxq
1999996: hyvxqdprhrny
1999997: ppeiceyyto
1999998: nvvvrjuwxm
1999999: trxdqajdvkss
2000000: dkqnvymyaeux
lines: 2000002
nums: 4000002 _________________ «One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity» |
|
|
|
 |
Ёрик : 187 Новичок Откуда: Кисловодск
|
Янв 29, 2012 15:08 |
|
|
| Спасибо, разобрался. Из-за копипаста было много повторных строчек, в одной из них я убрал цифру случайно. Еле нашел в ошибку в файле. |
|
|
|
 |
Vantuz-Subhuman : 660 Постоянный посетитель Откуда: издиснейленда
|
Янв 29, 2012 15:30 |
|
|
| Ёрик писал(а): |
| Спасибо, разобрался. Из-за копипаста было много повторных строчек, в одной из них я убрал цифру случайно. Еле нашел в ошибку в файле. |
А вот поэтому, при таком объёме данных, лучше самому читать файл построчно и сканировать (или парсить руками) уже их. Чтобы всегда можно было вывести на экран или ещё куда угодно последние обработанные перед ошибкой данные. _________________ «One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity» |
|
|
|
 |
|
|
Страница 1 из 1
|
Список форумов
-> Файлы и потоки ввода/вывода |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|