2012-03-18 72 views
0

我试图开发一小段代码,这将帮助我划定一个日志文件,该日志文件已将大量跟踪路由存储到一周内发送的不同IP。将日志文件解析为CSV格式

我希望能够在每个跟踪路线的开始和结束处使用'--- START ---'和'--- END ---'标记将它们分开。例子如下:

--- START --- 
Mon Mar 12 22:45:05 GMT 2012 
traceroute to xxxxxxx (xxxxxxxx), 30 hops max, 60 byte packets 
1 xxxxxxx (xxxxx) 1.085 ms 1.662 ms 2.244 ms 
2 xxxxxxxx (xxxxxxx) 0.792 ms 0.782 ms 0.772 ms 
3 xxxxxxxxx (xxxxxxxxx) 8.545 ms 9.170 ms 9.644 ms 
4 etc 
5 etc 
--- END --- 
--- START --- 
Mon Mar 12 22:45:05 GMT 2012 
traceroute to xxxxxxxxx (xxxxxxxx), 30 hops max, 60 byte packets 
1 139.222.0.1 (xxxxxxxxx) 0.925 ms 1.318 ms 1.954 ms 
2 10.0.0.1 (xxxxxxxx) 0.345 ms 0.438 ms 0.496 ms 
3 172.16.0.34 (xxxxxxxxx) 0.830 ms 2.553 ms 0.809 ms 
4 etc 
5 etc 
6 etc 
--- END --- 

谁能给我一只手伸进如何做到这一点做,在MATLAB或Java ......我也想算每一跳的路由跟踪,使量。这是

干杯--- END ---标签抛出之前给出的数字...

任何帮助将不胜感激。

+2

只要看看每一行的第一个字母。如果它在CAPS中:它是第一个包含日期的行。如果它是小写字母(traceroute),它是第二行。如果它是数字:它是“跳跃”线之一。 – wildplasser 2012-03-18 21:35:04

回答

2

快速“N脏例如:

import java.io.*; 
import java.text.*; 
import java.util.*; 
import java.util.regex.*; 

public class Main 
{ 
    private static class Record 
    { 
    public Date date; 

    public String to; 
    public int hops; 
    public int packetSize; 

    public String toString() 
    { 
     return date + " ::: " + to + ", " + hops + " hops, " 
     + packetSize + " bytes"; 
    } 
    } 

    public static void main(String[] args) throws Exception 
    { 
    Scanner s = new Scanner(new FileReader(new File("input.txt"))); 

    Record currentRecord = null; 
    ArrayList<Record> list = new ArrayList<Record>(); 

    while (s.hasNextLine()) { 
     String line = s.nextLine(); 

     if ("--- START ---".equals(line)) { 
     currentRecord = new Record(); 

     } else if ("--- END ---".equals(line)) { 
     list.add(currentRecord); 
     currentRecord = null; 

     } else if (currentRecord.date == null) { 
     currentRecord.date = new SimpleDateFormat(
      "EEE MMM dd HH:mm:ss zzz yyyy").parse(line); 

     } else if (line.startsWith("traceroute to ")) { 
     Pattern p = Pattern.compile(
      "traceroute to ([^ ]+) [^,]+, ([^ ]+) hops max, ([^ ]+) byte packets"); 
     Matcher m = p.matcher(line); 

     if (m.matches()) { 
      currentRecord.to = m.group(1); 
      currentRecord.hops = Integer.parseInt(m.group(2)); 
      currentRecord.packetSize = Integer.parseInt(m.group(3)); 
     } 
     } 
    } 

    for (int i = 0; i < list.size(); i++) 
     System.out.println(list.get(i).toString()); 
    } 

} 

输出:

Tue Mar 13 04:15:05 GMT+05:30 2012 ::: 203.98.69.105, 30 hops, 60 bytes 
Tue Mar 13 04:15:05 GMT+05:30 2012 ::: 62.193.36.27, 30 hops, 60 bytes 

我指点你在一堆不同的方向(ScannerPatternSimpleDateFormat等)。对于单个“网关”项目,您还可以使用String.split(),使用" "(两个空格)作为分隔符。

+0

感谢您的帮助。我也试图显示每个跟踪路由的跳数,我发现它很难,因为它没有声明最后的跟踪路由。而是显示'--- END ---'行之前的最后一条曲线。 我该如何去告诉代码在最后END行之前找到最后一条轨迹?然后id能够打印它制作的啤酒花的数量... – FredBones 2012-03-19 13:12:38

+0

@FredBones正如我在帖子中所说的,我已经通过向您介绍一堆您可以用来解析的类指出了正确的方向文本。提示:添加另一个“else if”块并解析跳跃,包括数字(首先出现!);用包含所有跳跃的'ArrayList'更新'Record'。我希望你能够自己写出逻辑。 – Manish 2012-03-19 17:50:54

+0

Manish,感谢帮助!我在一段时间内习惯性地使用了java,并且不得不跳回到它,所以发现它有点困难。我接受你的建议,并告诉你它有多好!干杯! – FredBones 2012-03-19 23:08:51