Я написал код, который почти существует с точки зрения того, как я хочу, чтобы он функционировал. Логика этого Java кода выглядит следующим образом:Запись уникальных строк в файл с использованием Java
- Прочитайте исходный файл из указанного места
- Как мы читаем каждую строку, применить регулярное выражение, чтобы получить результат группы захвата (в данном случае, URL)
- После того как все эти строки считываются, поместите URL и номер строки в к HashMap
- Скопируйте эти значения в список, и порядок их по номеру линии увеличения
- прочитайте исходный файл снова
- Для каждой строки число m atched в списке, пишите на наш новый файл
А вот код:
package preproc;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class Preproc {
public static void main(String[] args) {
File file = new File("C:\\Users\\AnthonyH\\Desktop\\file.txt");
BufferedReader br;
HashMap<String, Integer> hmap = new HashMap<>();
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
int linenumber = 0;
String event;
while ((event = br.readLine()) != null) {
//System.out.println("LINE=" + event);
Pattern regex = Pattern.compile("^.*url=(.*)");
Matcher check = regex.matcher(event);
if (check.find()) {
String match = check.group(1);
//System.out.println("GROUP=" + match + " LINE=" + linenumber);
if (!hmap.containsKey(match)) {
//System.out.println("ADDING TO INDEX");
hmap.put(match, linenumber);
}
}
linenumber++;
}
List<Integer> lineNumbers = new ArrayList<>(hmap.values());
//System.out.println("SIZE=" + lineNumbers.size());
Collections.sort(lineNumbers);
File file2 = new File("C:\\Users\\AnthonyH\\Desktop\\file2.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2)));
int currentLine = 0;
for (Integer line : lineNumbers) {
//System.out.println("LINE=" + line + "CURRENT LINE=" + currentLine);
while (currentLine < line) {
reader.readLine();
currentLine++;
}
writer.write(reader.readLine());
writer.newLine();
currentLine++;
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Проблема я столкнулся в том, что он пишет все уникальные строки матчей в HashMap, когда я хочу добавить только те, которые встречаются один раз в исходном файле. И.Е. пять экземпляров site1.com и один экземпляр site2.com, карта будет иметь первый экземпляр site1.com и уникальный экземпляр site2.com. Мне нужно только site2.com.
Вся помощь очень ценится.
Могли бы вы дать мне образец этого, если это возможно? Я не знаком с установкой двух значений в одну карту ключа-значения –
И в конечном итоге это будут довольно большие файлы, поэтому я оставлю их в памяти на данный момент –
Вы не устанавливаете два значения. Только один. И это значение является экземпляром класса с именем Occurrence, который имеет два поля: прочитайте https://docs.oracle.com/javase/tutorial/java/javaOO/ и попробуйте что-нибудь. Перед использованием карт и ввода-вывода вы должны освоить концепции классов, abjects и полей. –