Простите, если путанно и многословно объясняю...
Есть три файла. Содержания примерно такого:
Файл1:
бла1
бла2
бла3
Файл2:
бла0
бла8
бла1
бла17
бла2
бла6
Файл3:
блаблабла
бла бла
бла бла бла
бла
блабла
бла бла
То есть, как видно, некоторые (не все) строки из файла1
входят в файл2
, а кол-во строк файла2 = кол-ву строк файла3
Задача: найти номера тех строк в файле2, которые совпадают со строками файла1 и записать в файл4 (новый) строки содержания "<искомая строка> + <строка из файла3 с номером равным номеру искомой строки в файле2>
Ну, например (исходя из моего примера). Находим, что бла1 входит в третьей строке файла2, а бла2 в пятой строке. Значит, в файле4 запишем следующее: бла1 бла бла бла \n бла2 блабла
Надеюсь, понятно объяснил...
Я решил, что проще всего загнать все файлы в три разных массива и массивы уже сравнивать.
В чем проблема: массивы обнуляются сразу после цикла чтения файла. Примеры кода:
File cena = new File("cena.txt");
FileReader fileReader = new FileReader(cena);
BufferedReader reader = new BufferedReader(fileReader);
String line = null;
String[] cena_array;
cena_array = new String[1000];
int cena_n = 0;
while ((line = reader.readLine()) != null){
cena_n++;
cena_array[cena_n] = line;
System.out.println(cena_array[cena_n]); // Здесь выводит нормально элемент массива
}
System.out.println(cena_array[1]); // а здесь уже null, как и cena_n
Пробовал также через сканнер:
Scanner cena = new Scanner(new File("cena.txt"));
String[] cena_array;
cena_array = new String[1000];
int cena_n = 0;
while(cena.hasNext()){
cena_n++;
cena_array[cena_n] = cena.nextLine();
System.out.println(cena_array[cena_n]); // Здесь снова нормально выводит элементы
}
System.out.println(cena_array[2]); // Ну, а здесь null
Пробовал обойтись одними файлами, написал вот такую лабуду:
String s = "";
Scanner cena = new Scanner(new File("cena.txt"));
FileWriter wrt;
wrt = new FileWriter("res.txt");
String[] cena_array;
cena_array = new String[1000];
int n = 0;
int k = 0;
while(cena.hasNext()){
s = cena.nextLine();
Scanner ost = new Scanner(new File("ost.txt"));
boolean fl = true;
n = 0;
while ((ost.hasNext()&&(fl))){
n++;
if (s.equals(ost.hasNext())){
fl = false;
System.out.println("Нашли строку");
}
}
System.out.println("Вышли из while");
if (!fl){
Scanner ost_ost = new Scanner(new File("ost_ost.txt"));
k = 1;
while (k < n){
ost_ost.hasNext();
}
wrt.append(s+" "+ost_ost.hasNext()+"\n");
ost_ost.close();
System.out.println("Записали в файл");
}
В этом случае, программа выполняется бесконечно, не доходит до System.out.println("Нашли строку");
и до конца первого файла. Ну, это дурацкий вариант, конечно
Подскажите, что сделать в первых двух вариантах, чтобы массивы не обнулялись по выходу из цикла?
У меня получилось такое решение:
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("result.txt"))) {
Files
//построчно считываем первый файл
.lines(Paths.get("first.txt"))
.map(line -> {
try {
//построчно считываем второй файл
return Files
.lines(Paths.get("second.txt"))
//добавляем информацию о номере строки
.map(
new Function<String, Entry<Integer, String>>() {
private AtomicInteger lineNumber = new AtomicInteger();
@Override
public Entry<Integer, String> apply(String line) {
return new SimpleImmutableEntry<>(lineNumber.getAndIncrement(), line);
}
})
//ищем совпадение со строкой из первого файла
.filter(entry -> line.equalsIgnoreCase(entry.getValue()))
.findFirst();
} catch (IOException e) {
e.printStackTrace();
}
})
//фильтруем строки для которых нашлось совпадение
.filter(Optional::isPresent)
.map(Optional::get)
.map(entry -> {
try {
return Files
//читаем третий файл
.lines(Paths.get("third.txt"))
//получем n строку, где n номер строки найденой во втором файле
.skip(entry.getKey())
.findFirst()
//объединяем полученную строку со строкой из второго файла
.map(e -> e + entry.getValue())
.get();
} catch (IOException e) {
e.printStackTrace();
}
})
//записываем результат
.forEach(line -> {
try {
writer.write(line);
} catch (IOException e) {
e.printStackTrace();
}
});
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите пожалуйста как составить regexp для такой строки /utils/add/message? таких /действие может быть сколько угодно
Подскажите наиболее простую, надежную и наиболее "синхронную" схему взаимодействия Компонента с GUI и ServiceВ ИНЕТЕ описано много схем, но, как...