Java 走特定路线

Java 走特定路线,java,java.util.scanner,Java,Java.util.scanner,嗨,我有一个包含跟踪路由和ping的日志文件。 我用手指把它们分开 if (scanner.nextLine ().startsWith ("64 bytes"){} 所以我现在可以只处理ping 我对ping感兴趣的是time=XX 示例数据行= 64 bytes from ziva.zarnet.ac.zw (209.88.89.132): icmp_seq=119 ttl=46 time=199 ms 我一直在阅读其他人提出的类似问题,我不知道如何应用到我的问题上 我确实需要的只是数字

嗨,我有一个包含跟踪路由和ping的日志文件。 我用手指把它们分开

if (scanner.nextLine ().startsWith ("64 bytes"){}
所以我现在可以只处理ping

我对ping感兴趣的是time=XX

示例数据行=

64 bytes from ziva.zarnet.ac.zw (209.88.89.132): icmp_seq=119 ttl=46 time=199 ms
我一直在阅读其他人提出的类似问题,我不知道如何应用到我的问题上

我确实需要的只是数字,因为我将把他们放入一个csv文件,这样我可以使数据的图表

编辑:使用robins解决方案,我现在在屏幕上看到我的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);
   }
}
好的。这只需要移动线路分配。帽子。但是说得很清楚D

尝试使用a来提取所需的数据:

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));
        }
    }
}
尝试使用以下工具提取所需的数据:

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));
        }
    }
}

或者,如果不想执行reg ex magic,您可以使用
String
上的可用方法

String line = ...
String pingAsString = line.substring( line.lastIndexOf("=")+1, (line.length() - " ms".length() ) );
Integer ping = Integer.valueOf( pingAsString );

或者,如果不想执行reg ex magic,您可以使用
String
上的可用方法

String line = ...
String pingAsString = line.substring( line.lastIndexOf("=")+1, (line.length() - " ms".length() ) );
Integer ping = Integer.valueOf( pingAsString );
你的问题是,你称之为:

if (scanner.nextLine ().startsWith ("64 bytes")){
这意味着该行被抓取,但未指定给变量。结果立即被测试为startingWith,但随后您再次调用nextLine,并获得下一行,当然:

   String line = scanner.nextLine ();      
这是第二行

你的问题是,你称之为:

if (scanner.nextLine ().startsWith ("64 bytes")){
这意味着该行被抓取,但未指定给变量。结果立即被测试为startingWith,但随后您再次调用nextLine,并获得下一行,当然:

   String line = scanner.nextLine ();      

这是第二行

为什么不使用正则表达式呢?类似的东西可能会起作用,时间=(\d)+为什么不使用正则表达式?类似的东西可能会起作用,时间=(\d)+数据确实以64字节开始,我只是在误导您,因为我从控制台窗口复制了一个计数器,所以我知道我拥有所有数据。所以我删除了我的备注,我的解决方案应该会起作用。注意,我现在只解释了如何调用nextLine一次;如果使用(line.startsWith(“64字节”){String ms=line.replaceAll(.*time=([0-9]+)ms)”,“$1”);System.out.println(“ping=“+ms”);}添加println进行检查,但我没有得到任何接近所需输出的结果,则一些字符串仅被附加到ping=XX,但大多数仍然是原始字符串。此外,它似乎没有明显的模式,有时一行中的20个会被更改为1/30。时间总是以毫秒为单位吗?两个条目之间是否总是有换行符?注意:如果只想将时间附加到输出,则不需要将其转换为双精度。int更合适,因为从来没有一部分ms返回,是吗?如果没有发现错误,也许您可以在github或其他地方提供一个示例日志文件。@user1290213:我通过ping不同的主机创建了一个日志文件,并且我的脚本按预期提取所有时间。数据确实以64字节开始,我只是在误导你,因为我从控制台窗口复制了一个计数器,所以我知道我有所有的数据。所以我删除了我的评论,我的解决方案应该有效。注意,我现在只解释了如何调用nextLine一次;如果使用(line.startsWith(“64字节”){String ms=line.replaceAll(.*time=([0-9]+)ms)”,“$1”);System.out.println(“ping=“+ms”);}添加println进行检查,但我没有得到任何接近所需输出的结果,则一些字符串仅被附加到ping=XX,但大多数仍然是原始字符串。此外,它似乎没有明显的模式,有时一行中的20个会被更改为1/30。时间总是以毫秒为单位吗?两个条目之间是否总是有换行符?注意:如果只想将时间附加到输出,则不需要将其转换为双精度。int更合适,因为从来没有一部分ms返回,是吗?如果没有发现错误,也许您可以在github或其他地方提供一个示例日志文件。@user1290213:我通过ping不同的主机创建了一个日志文件,并且我的脚本按预期一直提取。线程“main”java.lang.NumberFormatException中的异常:对于输入字符串:“4.60”@LINE:Integer ping=Integer.valueOf(pingAsString);当然,4.60不是整数,因此无法对其进行解析。用双倍代替PDERP:D lol这是一个漫长的星期。。。除了。。。现在它似乎有一个小问题,它缺少第一个值,取第二个值,缺少第三个值,取第四个值,等等。所以每隔一个值做一次,然后缺少第一个值。作为这里的新手,我将编辑我的主要帖子,并在那里添加我的代码,不确定我是否可以在这个评论中这样做?线程“main”java.lang.NumberFormatException中的异常:对于输入字符串:“4.60”@LINE:Integer ping=Integer.valueOf(pingAsString);当然,4.60不是整数,因此无法对其进行解析。用双倍代替PDERP:D lol这是一个漫长的星期。。。除了。。。现在它似乎有一个小问题,它缺少第一个值,取第二个值,缺少第三个值,取第四个值,等等。所以每隔一个值做一次,然后缺少第一个值。我是新来这里的,我会编辑我的主要帖子,并在那里添加我的代码,不确定我是否可以在这个评论中这样做?