2016-02-29 2 views
0

Я написал код, который почти существует с точки зрения того, как я хочу, чтобы он функционировал. Логика этого Java кода выглядит следующим образом:Запись уникальных строк в файл с использованием Java

  1. Прочитайте исходный файл из указанного места
  2. Как мы читаем каждую строку, применить регулярное выражение, чтобы получить результат группы захвата (в данном случае, URL)
  3. После того как все эти строки считываются, поместите URL и номер строки в к HashMap
  4. Скопируйте эти значения в список, и порядок их по номеру линии увеличения
  5. прочитайте исходный файл снова
  6. Для каждой строки число 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.

Вся помощь очень ценится.

ответ

0

Создайте Map<String, Occurrence> где Occurrence содержит (номер первой строки) и количество вхождений URL-адреса. При записи игнорируйте строки, для которых число вхождений составляет> 1.

Это один из способов, есть и другие.

У вас может быть Set URL-адресов, которые встречаются не менее двух раз. Как только вы найдете URL-адрес, который уже находится на карте, вы добавляете его в набор. При записи вы игнорируете URL-адреса, которые находятся в наборе.

Обратите внимание, что если файл не слишком большой, вы можете сохранить строки в памяти, а не перечитывать файл.

+0

Могли бы вы дать мне образец этого, если это возможно? Я не знаком с установкой двух значений в одну карту ключа-значения –

+0

И в конечном итоге это будут довольно большие файлы, поэтому я оставлю их в памяти на данный момент –

+1

Вы не устанавливаете два значения. Только один. И это значение является экземпляром класса с именем Occurrence, который имеет два поля: прочитайте https://docs.oracle.com/javase/tutorial/java/javaOO/ и попробуйте что-нибудь. Перед использованием карт и ввода-вывода вы должны освоить концепции классов, abjects и полей. –

0
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, List<Integer>> hmap = new LinkedHashMap<String, List<Integer>>(); 

    try { 

     br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 

     int linenumber = 0; 
     String event; 

     while ((event = br.readLine()) != null) { 

      Pattern regex = Pattern.compile("^.*url=(.*)"); 
      Matcher check = regex.matcher(event); 
      if (check.find()) { 
       String match = check.group(1); 

       List<Integer> lineNumbers = new ArrayList<Integer>(); 
       if (hmap.containsKey(match)) { 
        lineNumbers = hmap.get(match); 
       } 
       lineNumbers.add(linenumber); 

        hmap.put(match, lineNumbers); 
      } 

      linenumber++; 
     } 

     List<List<Integer>> lineNumbers = new ArrayList<List<Integer>>(hmap.values()); 

     File file2 = new File("C:\\Users\\AnthonyH\\Desktop\\file2.txt"); 

     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2))); 



     for (List<Integer> linesOccurences : lineNumbers) { 

      int currentLine = 0; 
      if(linesOccurences.size() == 1) 
      { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
       int line = linesOccurences.get(1); 
       while (currentLine++ < line) { 
        reader.readLine(); 
       } 
       writer.write(reader.readLine()); 
       writer.newLine(); 
       reader.close(); 
      } 

     } 

    writer.close(); 

    } catch (IOException e) { 

     e.printStackTrace(); 

    } 

} 
} 

Просмотрите отредактированный код. В предыдущем случае объект BufferedReader не был в правильном месте.

+0

Я пробовал это, но он по-прежнему дает мне один экземпляр уникальной строки –

+0

Просто увидел редактирование. Спасибо! –

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