Java 将日志文件解析为CSV格式
我试图开发一个小代码,帮助我划分一个日志文件,该文件存储了大量到不同IP的跟踪路由,这些路由是在一周内发送的 我希望在每条跟踪路线的开始和结束处使用'--START---'和'--END---'标记来分割它们。示例如下:Java 将日志文件解析为CSV格式,java,parsing,matlab,csv,logging,Java,Parsing,Matlab,Csv,Logging,我试图开发一个小代码,帮助我划分一个日志文件,该文件存储了大量到不同IP的跟踪路由,这些路由是在一周内发送的 我希望在每条跟踪路线的开始和结束处使用'--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.6
--- 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--标记之前给定的数字
任何帮助都将不胜感激
干杯。Quick'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());
}
}
我向您指出了一系列不同的方向(
扫描仪
,模式
,简化格式
,等等)。对于单个“网关”项目,您还可以使用String.split()
使用”
(两个空格)作为分隔符。只需查看每行的第一个字母。如果是大写:它是第一行,上面有日期。如果是小写(traceroute),则是第二行。如果是数字:这是一个“跳跃”行。谢谢你的帮助。我还试图显示每条跟踪路由的跳数,我发现这很困难,因为它没有说明最后一条跟踪路由。而是显示'--END---'行之前的最后一个跟踪。我如何告诉代码在最后一行之前找到最后一个跟踪?然后我就可以打印出啤酒花的数量了…@FredBones正如我在帖子中所说的,我向你介绍了一系列可以用来解析文本的类,为你指明了正确的方向。提示:如果阻塞并解析跃点,则添加另一个else,包括数字(首先出现!);使用包含所有跃点的ArrayList
更新Record
。我希望你能自己写出逻辑。曼尼什,感谢你的帮助!我已经有一段时间没有使用java了,所以我觉得它有点难。我会接受你的建议,然后再告诉你进展如何!干杯Manish,我发现很难解释代码中发生了什么。我试图让它读取每条跟踪路线的每一行,但不确定如何读取。如果你能让我开始只是告诉我如何获得最终的跳数,这将是非常感谢。。。
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