2016-11-03 1 views
0

с этой проблемой у меня есть, я хотел бы поразить двух зайцев одним выстрелом.Как добавить пользовательский ввод в новую строку, а также избежать возможных дубликатов в моем файле .CSV с помощью FileWriter?

В настоящее время я пытаюсь вывести пользовательский ввод из текстовых полей в существующий файл .CSV с данными, уже находящимися внутри. Моя первая проблема связана с невозможностью добавления в новую строку, мой код в настоящее время добавляет к последнему элементу в файле .CSV, тем самым создавая еще более длинную строку, а не новую строку.

Далее, я хотел бы проверить мой .CSV на возможные дубликаты ввода пользователей. Если пользователь хочет добавить банану в список, а код проверяет файл .CSV и находит в нем банан, мы можем успешно выполнить ошибку и предупредить пользователя.

Вот мой код в настоящее время, чтобы попытаться попробовать и добавить в новую строку, но так или иначе это просто не работает:

String fileName = "temp.csv"; 
    try { 
     FileWriter fileWriter = 
      new FileWriter(fileName, true); 

     BufferedWriter bufferedWriter = 
       new BufferedWriter(fileWriter); 

     bufferedWriter.write("\n" + fruitNameField.getText()); 
     bufferedWriter.write(','); 
     bufferedWriter.write(quantityOfFruitField.getText()); 
     bufferedWriter.write(','); 
     bufferedWriter.write(fruitLocationField.getText()); 
     //bufferedWriter.write(','); 

     bufferedWriter.close(); 

    } 
    catch(IOException ex) 
    { 
     System.out.println("Error writing to file" + fileName + "'"); 
    } 

В то время как я хотел 3 различных данных, вводимых пользователем, и для добавления к новой линии, код выше заканчивается, выводя следующим образом: Банана, 2, storeOrange, 3, store. Кажется, что он игнорирует новую командную строку.

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

Этот вопрос предназначен, главным образом, для добавления к новой строке, но если бы я мог получить любую помощь в этом, это было бы удивительно.

Насколько я знаю, для проверки дубликатов я считаю, что мне придется импортировать текстовый файл и записать его в массив, но что, если это большой файл?

Как только мой файл находится в массиве, я проверю, является ли пользовательский ввод равным любому тексту, находящемуся внутри массива, и если это так, выведите ошибку. Это мой подход по этому вопросу, пожалуйста, скажите мне, могу ли я улучшить это в любом случае.

Спасибо за вашу помощь, очень признателен.

+0

BufferedWriter имеет метод Newline(). –

+0

Спасибо, что решил половину моей проблемы! – juiceb0xk

ответ

0

Я бы предложил использовать библиотеку, такую ​​как opencsv, для чтения и записи в файлы csv.

Пример:

import com.opencsv.CSVReader; 
import com.opencsv.CSVWriter; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 


public class JavaApplication28 { 

    public static void main(String[] args) throws IOException { 
     String input = fruitNameField.getText(); 
     String filename = "temp.csv"; 

     writeToCsvFile(input,filename); 
    } 

    private static void writeToCsvFile(String input, String filename) throws IOException { 
     if(!isDuplicate(input,filename)){ 
      CSVWriter writer = new CSVWriter(new FileWriter(filename,true), ','); 
      String[] entries = {fruitNameField.getText(),quantityOfFruitField.getText(),fruitLocationField.getText()}; 
      writer.writeNext(entries); 
      writer.close(); 
     } 
     else{ 
      System.out.println("fruitName already exists."); 
     }   
    } 

    private static boolean isDuplicate(String input, String filename) throws IOException { 
     boolean found = false; 
     CSVReader reader = new CSVReader(new FileReader(filename)); 
     String [] nextLine; 
     while ((nextLine = reader.readNext()) != null) { 
      for(int i = 0; i<nextLine.length; i++){ 
       if(nextLine[i].equalsIgnoreCase(input)){ 
        found = true; 
        break; 
       } 
      }   
     } 
     return found; 
    }  
} 
+0

Это потрясающе, спасибо вам большое. – juiceb0xk

0

Если файл не очень большой, я бы предложил прочитать весь файл и сохранить его в файле Map, клавишами которого являются слова, которые вы добавляете (которые вы хотите проверить на наличие дубликатов). В каждой новой строке вы можете проверить, содержит ли карта ключ (который стоит только O (1), поэтому он очень эффективен).

Для новых строк обратите внимание, что это зависит от среды, это может быть \r\n (для Windows) или \n для Unix/Mac OS. Лучше всего использовать System.getProperty("line.separator");

+0

Почему бы просто не использовать Набор вместо Карты. Кроме того, BufferedWriter имеет newLine(), который абстрагирует среду для вас. –

+0

Хм, я никогда раньше не использовал карту, как вы думаете, я читал в ней? Какова будет примерная строка кода? – juiceb0xk

+0

@MichaelMarkidis Да java.util.Set подходит, я упомянул Map как концепцию структуры данных. Для второго момента вы правы, но также хорошо знать, что OP может использовать систему.getProperty вне контекста BufferedWriter. – isah