2016-10-25 8 views
0

JavaアプリケーションのテキストファイルからArraylistに特定の値をコピーしたいと思います。Javaアプリケーションのテキストファイルからintまたはdouble値を解析する方法

package com.main; 
import com.collection.Ingridient; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class FileReaderApp { 


    public static void main(String[] args) throws FileNotFoundException, IOException { 
     Ingridient i_one = new Ingridient(); 
     ArrayList<Ingridient> db = new ArrayList<Ingridient>(); 
     FileReader fin = new FileReader("/home/yati/Desktop/test"); 
     Scanner src = new Scanner(fin); 
// Read the ingridient from text file. 
     while (src.hasNext()) { 
      if (src.hasNext()) { 
       i_one.setName(src.next()); 
       System.out.println("Name: " +src.next()); 
      } else 
       if(src.hasNextDouble()) { 
       i_one.setUnit_price(src.nextDouble()); 
       System.out.println("Unit Price: " +src.nextDouble()); 
      } 
       else if (src.hasNextInt()) { 
        i_one.setUnit(src.nextInt()); 
        System.out.println("Unit: " +src.nextInt()); 
       } else { 
        System.out.println("File format error."); 
        return; 
       } 
      db.add(i_one); 
     } 
     fin.close(); 

    } 

} 

:これは(test.textとしての私のデスクトップに保存されている)私のテキストファイル

String name = carrot; 
double unit_price = 200; 
int unit = 10; 

私は次のように私のメインのアプリケーションに存在しているのArrayListに格納したい。この値であり、彼女の、Ingridientクラスのコードは次の通りです:

package com.collection; 
public class Ingridient { 
    String name; 
    Double unit_price; 
    int unit; 

    public Ingridient() { 
     name = null; 
     unit_price = null; 
     unit = 0; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setUnit_price(Double unit_price) { 
     this.unit_price = unit_price; 
    } 

    public void setUnit(int unit) { 
     this.unit = unit; 
    }  

} 

を私の問題は、私のアプリケーションがIngridientオブジェクトの名前のみを格納することができ、それが単位とUNIT_PRICEの任意の値を保存することができないということです。取得された出力は次のとおりです。 enter image description here 私はどこか誤解していますが、私はこの問題を解決できません。なにか提案を?

+0

テキスト形式は固定ですか?テキストファイル内の文字列のいずれもdouble値として解析することはできません。 –

+0

この文脈でファイルをフォーマットする正しい方法を教えてください。私は昨晩働いていたので、解決策を見つけることができません –

答えて

1

これはそれを行う必要があります。

public static void main(String[] args) throws IOException { 
    String content = "String name = carrot;\ndouble unit_price = 200;\nint unit = 10;"; 
    try (Scanner sc = new Scanner(content)) { 
     sc.useDelimiter("(;*\n*.+ .+ =)|;"); 
     List<Incredient> incredients = new ArrayList<>(); 
     while (true) { 
      Incrediend incredient = new Incredient(); 
      if (sc.hasNext()) { 
       String name = sc.next(); 
       incredient.setName(name); 
       System.out.println("Name: " + name); 
      } else { 
       break; 
      } 
      if (sc.hasNextDouble()) { 
       double unitPrice = sc.nextDouble(); 
       incredient.setUnit_price(unitPrice); 
       System.out.println("Unit Price: " + unitPrice); 
      } else { 
       break; 
      } 
      if (sc.hasNextInt()) { 
       int unit = sc.nextInt(); 
       incredient.setUnit(unit); 
       System.out.println("Unit: " + unit); 
      } else { 
       break; 
      } 
      incredients.add(incredient); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

これが原因で、私は(;*\n*.+ .+ =)|;を使用しました区切り文字で動作します。 この正規表現のpiceは、保存に関心のないテキストファイルのすべての部分を削除するだけです。 next()への2つの呼び出しがあるので、使用したい場合はここで

i_one.setName(src.next()); 
System.out.println("Name: " +src.next()); 

、あなたは、スキャナから2つのトークンを読んでいる:

は、たとえばこのために、あなたのアプローチには問題がいくつかあります複数のものに対して同じトークンを使用するには、新しい変数を作成して保存する必要があります(例:String name = sc.next())。 Scannerが使用している

デフォルトの区切り文字は、単一のスペースで、そのため、あなたのコードでは、hasNextDouble()hasNextInt()は真ではありません、テキストファイル内のすべての数字は;で終わります。

ここで何をしようとしているのか分かりませんが、テキストファイルからjavaコードを解析するのは珍しいことです。テキストファイルの形式を変更できる場合は、解析しやすい形式(CSVなど)を選択する必要があります。

+0

それは動作します。ありがとう。実際に私はテキストファイルからコンテンツを解析し、ArrayListに格納しようとします。ありがとうalot –

+0

@ YatishBathla私は助けることができてうれしいです。 – Titus

0

src.hasNext()、それは私も入力フォーマットとしてJSONを使用することをお勧めします場合/他の条件 の一つにジャンプすることはありませんので、あなたがあなたのファイルに持っているすべての行を選択します;)

+0

このタスクの参考資料/例はありますか?ありがとう –

0
while (src.hasNext()) { 
     if (src.hasNext()) { 

それ

+0

あなたはこのタスクを実行するための可能な解決策を提供できますか?ありがとう –

+0

スキャナが空白で行を分割しているように見えるので、if文の順序を変更することはできません。したがって、すべての数字は「;」で終わります –

0

あなたの最初のinacessible常に真と別の他{}セクションの条件が必要な出力を得るために間違っている場合...

(src.hasNext())であれば

この条件は、条件が決して実行されない場合、次のオブジェクトと次のようなものが存在するため常に満足します。これは、最初のif条件で常にsysoutからのデータを出力する出力に見ることができます。

私はstartsWithメソッドを文字列クラスで指定するようにコードを変更しました。あなたはそれはあなたがもしあれば、これらの特殊文字を削除してください解析の前に:

NOTE ...それがお役に立てば幸いです。 (セミ-colonsなど)

while (src.hasNext()) { 
      String input = src.next(); 
      if (input.startsWith("name")) { 
       i_one.setName(input); 
       System.out.println("Name: " + input); 
      } else if (input.startsWith("unit_price")) { 
       i_one.setUnit_price(Double.parseDouble(input)); 
       System.out.println("Unit Price: " + input); 
      } else if (input.startsWith("unit")) { 
       i_one.setUnit(Integer.parseInt(input)); 
       System.out.println("Unit : " + input); 
      } else { 
       System.out.println("File format error."); 
       return; 
      } 
      db.add(i_one); 
} 
+0

数値は常に ";"で終わります。 hasNextIntまたはhasNextDoubleは決して真ではありません。 –

+0

私はシーケンスを変更しますが、それでも問題は同じです。それはすべての文字列を考慮することができます。 –

0

テキストファイルの構造は、所望の値を解析するための非常に良いではありません。

あなたにできるなら

carrot,200,10 

は、このように1行であなたの所望の成分のすべての値を持つようなものに変更する必要があります。この行を "、"で分割すると、オブジェクトをインスタンス化するために必要なすべての値が得られます。

(タスクの一部であるため)テキスト形式を変更できない場合は、テキストファイルの行全体を読み、それらのトリプルを解釈してオブジェクトを取得する必要があります。したがって、必要な値がすべてそこにあることを確認することもできます。

+0

この場合、例外がスローされます。だからうまく動作しない –

+0

それに応じてファイルの読み取りコードを変更する必要があります。 –

0

テキストファイルの構造が常に同じ場合は、文字列クラスのcontainsメソッドを使用できます。例:

public class FileReaderApp { 
     public static void main(String[] args) throws FileNotFoundException, IOException { 
      Ingridient i_one = new Ingridient(); 
      ArrayList<Ingridient> db = new ArrayList<Ingridient>(); 

      try(BufferedReader br = new BufferedReader(new FileReader("/home/yati/Desktop/test.txt"))) {   
       String line ; 
       while ((line = br.readLine())!=null) { 
        String [] splited; 
        if(line.contains("String name")){ 
         splited= line.split(" "); 
         i_one.setName(splited[splited.length-1].replace(";", "")); 
         System.out.println(i_one.name); 
        } 
        else if(line.contains("double unit_price")){ 
         splited= line.split(" "); 
         i_one.setUnit_price(Double.parseDouble(splited[splited.length-1].replace(";", ""))); 
         System.out.println(i_one.unit_price); 
        } 
        else if(line.contains("int unit")){ 
         splited= line.split(" "); 
         i_one.setUnit(Integer.parseInt(splited[splited.length-1].replace(";", ""))); 
         System.out.println(i_one.unit); 
        } 
       }    
      } 
      db.add(i_one); 
     }  
    } 
関連する問題