2012-03-24 10 views
0

こんにちは私はトレースルートとpingを含むログファイルを持っています。 アイブ氏は、私は今のためだけのpingで作業することができ特定の部分を取る

if (scanner.nextLine().startsWith ("64 bytes"){} 

を使用して、これらを区切ります。

私がpingからに興味があるすべては時間= XX

例のデータライン=

64 bytes from ziva.zarnet.ac.zw (209.88.89.132): icmp_seq=119 ttl=46 time=199 ms 

私は他の人々に同様の質問を読んでいると私はに適用するかどうかはわかりません鉱山。

データのグラフを作成できるように、私は文字通り数字だけをcsvファイルに入れておく必要があります。

編集:ロビンズソリューションを使用する私は今、私のpingを画面上に出すようにしています。

while (scanner.hasNextLine()) { 
    //take only pings. 
    if (scanner.nextLine().startsWith ("64 bytes")){ 
     String line = scanner.nextLine();  
     String pingAsString = line.substring (line.lastIndexOf ("=") + 1, (line.length() - "ms".length())); 
     Double ping = Double.valueOf (pingAsString); 
     System.out.println ("PING AS STRING = "+ping); 
    } 
} 

OKソート。ラインアサインメントを行う必要があるだけです。 CAPS。しかし、明らかにした。 :D

+3

なぜ正規表現を使用しないのですか?そのようなものが動作する可能性があります。time =(\ d)+ – Asterisk

答えて

1

それとも、魔法

をREG-EXを実行したくない場合は、あなただけの Stringで使用可能なメソッドを使用することができます
String line = ... 
String pingAsString = line.substring(line.lastIndexOf("=")+1, (line.length() - " ms".length())); 
Integer ping = Integer.valueOf(pingAsString); 
+0

スレッド "main"の例外java.lang.NumberFormatException:入力文字列の場合: "4.60" @LINE:Integer ping = Integer.valueOf(pingAsString); – user1290213

+0

もちろん、4.60は整数ではないため、解析することはできません。代わりにダブルを使用 – Robin

+0

herpderp:D LOLは長い週でした... 華麗に近いところを除いて... これはちょうどちょうど、最初の値がない、2番目の、3番目の欠落、4番目の取得他のすべてと最初に行方不明をしている。 私のメインポストを編集してそこにコードを追加すると、このコメントでこれを行うことができますか? – user1290213

3

はあなたが必要とするデータの一部を引き出すためにRegularExpressionを使用してみてください:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegExTest { 
    public static void main(String[] args) { 
     String test = "line= 14103 64 bytes from ziva.zarnet.ac.zw (209.88.89.132): icmp_seq=119 ttl=46 time=199 ms"; 

     // build the regular expression string 
     String regex = ".*time=(\\d+).*"; 

     // compile the regular expresion into a Pattern we can use on the test string 
     Pattern pattern = Pattern.compile(regex); 

     Matcher matcher = pattern.matcher(test); 

     // if the regular expression matches, grab the value matching the 
     // expression in the first set of parentheses: "(\d+)" 
     if (matcher.matches()) { 
      System.out.println(matcher.group(1)); 
     } 
    } 
} 
0
Scanner scanner = new Scanner (new File ("./sample.log")); 
while (scanner.hasNext()) 
{ 
    String line = scanner.nextLine(); 
    if (line.startsWith ("64 bytes")) { 
     String ms = line.replaceAll (".*time=([0-9]+) ms", "$1"); 
     System.out.println ("ping = " + ms); 
    } // else System.out.println ("fail " + line); 
} 

あなたの問題は、あなたが呼び出すことを、次のとおりです。

if (scanner.nextLine().startsWith ("64 bytes")){ 

これは、行がグラブされているが、変数に割り当てられていないことを意味します。結果はすぐにstartingWithについて試験したが、その後もう一度nextLineを呼び出し、そしてもちろんの次の行、取得された:

String line = scanner.nextLine();  

二行目です。

+0

データは64バイトから始まりますが、コンソールウィンドウからコピーしたので私はちょうど誤解を招いていました。カウンタを作成したので、すべてのデータがあることがわかりました。 – user1290213

+0

は、より明確になるように元の投稿で今編集されました。 – user1290213

+0

私は私の発言を削除し、私の解決策は動作するはずです。ここで、nextLineを一度だけ呼び出す方法について説明します。 –

関連する問題