2016-11-03 9 views
0

この問題は私が持っている、私は1つの石で2つの鳥をヒットしたいと思います。FileWriterを使用して自分の.CSVファイル内に重複が存在しないようにしながら、ユーザー入力を新しい行に追加する方法はありますか?

私は現在、テキストフィールド内のユーザー入力を既存の.CSVファイルに出力しようとしています。既存の.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種類のユーザ入力を望んでいますし、新しい行に追加しますが、上記のコードは次のように出力されます:Banana、2、storeOrange、3、store。新しい行コマンドを無視しているようです。

私の2番目の問題は、重複をチェックしています。私の人生にとって、私はjavaを使ってテキストファイル内の重複をチェックすることに関連するリソースを見つけることができません。

この質問は、主に新しい行に追加するためのものですが、私がこれに関する助けを得ることができれば、それは素晴らしいことでしょう。

私の知る限り、重複をチェックするために、テキストファイルをインポートして配列に書き込む必要がありますが、大きなファイルの場合はどうすればよいでしょうか?

ファイルが配列になったら、ユーザー入力が配列内のテキストと等しいかどうかを確認し、そうであればエラーをスローします。これが私のアプローチです。何らかの形で改善できるかどうか教えてください。

ご協力いただきありがとうございました。

+0

BufferedWriterの改行()メソッドを有します。 –

+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が適切です、私はデータ構造の概念としてマップを述べた。 2番目のポイントは正しいですが、彼がシステムを使用できるOPを知ることも良いことです。BufferedWriterコンテキスト外のどこでもgetProperty。 – isah

関連する問題