2013-05-17 66 views
0

剛開始學習java如何使用java中的集合集合提取列?

我有以下數據集

Date first seen   Duration Proto  Source IP Addr:Port  Destination IP Addr:Port Packets Bytes Flows 
2013-03-03 23:54:46.574  8.000 UDP  108.169.77.76:12345 -> 108.169.0.112:53   5  325  1 
2013-03-03 23:59:51.984  0.000 UDP  100.253.69.196:62458 -> 100.256.234.129:1947   1  68  1 
2013-03-03 23:59:52.048  0.000 UDP  108.450.45.35:123124 -> 108.123.0.987:9101  2  1686  1 

我想用Java編寫一個程序來獲得唯一的源IP地址的列和目的IP地址的列?有人能告訴我一個如何完成這個任務的示例代碼嗎?

+3

你有代碼嗎?想法? – Maroun

+1

此數據集位於何處?一個文本文件? – Dukeling

+0

將每行分割爲空白,取第5個和第7個元素。 – 2013-05-17 09:31:22

回答

1

假設您用輸入數據逐行讀取了一個文本文件。然後就可以用這個片段來分析每一行,並獲得源和目的地的IP地址:

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

public class Main { 

    private static final String REGEX_IP = "(?:[0-9]{1,3}\\.){3}[0-9]{1,3}"; 
    private static final Pattern LINE_PATTERN = Pattern.compile(
     "(" + REGEX_IP + "):[0-9]+\\s+->\\s+(" + REGEX_IP + "):[0-9]+"); 

    public static void main(final String[] args) { 
     String line = 
      "2013-03-03 23:54:46.574  8.000 UDP  108.169.77.76:12345 -> 108.169.0.112:53   5  325  1"; 

     Matcher matcher = LINE_PATTERN.matcher(line); 
     if (matcher.find()) { 
      System.out.println("Source IP: " + matcher.group(1)); 
      System.out.println("Destination IP: " + matcher.group(2)); 
     } 
     else { 
      System.out.println("No match"); 
     } 
    } 
} 

正則表達式匹配解析線(find()方法),並且如果發現匹配,則匹配組(...)內同時提供的IP地址:

  • matcher.group(1) - 源IP
  • matcher.group(2) - 目的地IP
2

只需加入@BorisBrodski回答:

文本文件應該按行分割。在Java中,您可以使用BufferedReader來完成此操作。

try { 
    File file = new File("/where/my/file/is.txt"); 
    BufferedReader in = new BufferedReader(new FileReader(file)); 
    String line = null; 
    while ((line = in.readLine()) != null) { 
     // ... do something with `line` 
    } 
} catch (FileNotFoundException e) { 
    // ... handle exception 
} catch (IOException e) { 
    // ... handle exception 
} 
3

這將是更簡單,使用一個或多個空格輸入行拆分爲隔膜

String line = 
    "2013-03-03 23:54:46.574  8.000 UDP  108.169.77.76:12345 -> 108.169.0.112:53   5  325  1"; 

String[] split = line.split(" +"); 
System.out.println(split[4]); 
System.out.println(split[6]); 

此輸出:

108.169.77.76:12345 
108.169.0.112:53 

現在重用split方法,我們可以單獨的IP從端口的地址:

String[] split = line.split(" +"); 
System.out.println(split[4].split(":")[0]); 
System.out.println(split[6].split(":")[0]); 

該輸出IP地址,而不端口:

108.169.77.76 
108.169.0.112 

請當心,該解決方案是缺少檢查,這將防止您從得到ArrayIndexOutOfBoundsException例外情況下,您的數據看起來並不如你預期。在使用[..]運算符之前,您總是要驗證數組中元素的數量。

更新:的IPv6不會忽略

如果IPv6地址是可能的,你可以使用:

String[] split = line.split(" +"); 
System.out.println(getIP(split[4])); 
System.out.println(getIP(split[6])); 

private static String getIP(String ipWithPort) { 
    int index = ipWithPort.lastIndexOf(":"); 
    if (index < 0) { 
     throw new RuntimeException("Invalid format: " + ipWithPort); 
    } 
    return ipWithPort.substring(0, index); 
} 
+0

嘿,我遇到了一個問題:一些IP地址的形式:2001:63..b1:fe9d.88,在地址中有多個「:」,我應該如何通過截斷最後一個分號後的部分來分割上面的IP地址? – user1769197