2013-12-18 115 views
1

我有一個文件後的數據,我想看看我能不能做一個正則表達式這裏解析正則表達式解析多數據

 
Name (First Name) City  Zip 
John (retired)     10007 
Mark    Baltimore 21268 
.... 
.... 
Avg Salary 
70000    100% 

它不是一個大文件,整個數據從文件在一個新的行字符(\ n)的(字符串數據=「從文件中的數據」)

  1. 我想獲得名稱,城市,郵編,然後工資,個細節
  2. 一個String對象提供
  3. 數據inside()被認爲是Name域的一部分。
  4. 對於名稱字段空間被認爲是有效的,並且其他字段沒有空間。
  5. 「平均工資」僅適用於文件

年底將很容易通過在Java中的正則表達式解析做到這一點?

+1

和你有什麼解析? –

+0

http://stackoverflow.com/questions/20621252/how-to-split-a-file-into-multiple-arrays-display-them-and-perform-calculations/20621864#20621864這將有助於 – Ashish

+0

我試圖獲得姓名,城市,郵編,然後是工資,百分比細節 – user3084618

回答

2

如果文本文件是空間對齊的,您可以(也可能應該)根據字符數提取字段。因此,您將每行中的第一個n字符作爲名字,下一個m字符作爲城市,等等。

這是一個使用上述方法提取的代碼,通過自動計算字段的字段長度,假設我們知道標題。

String data = "data from the file"; 

// This is just to ensure we have enough space in the array 
int numNewLines = data.length()-data.replace("\n","").length(); 
String[][] result = new String[numNewLines][3]; 
String[] lines = data.split("\n"); 
int avgSalary = 0; 
int secondFieldStart = lines[0].indexOf("City"); 
int thirdFieldStart = lines[0].indexOf("Zip"); 
for(int i=1; i<lines.length; i++){ 
    String line = lines[i].trim(); 
    if(line.equals("Avg Salary")){ 
     avgSalary = Integer.parseInt(lines[i+1].substring(0,secondFieldStart).trim()); 
     break; 
    } 
    result[i-1][0] = line.substring(0,secondFieldStart).trim(); // First Name 
    result[i-1][1] = line.substring(secondFieldStart,thirdFieldStart).trim(); // City 
    result[i-1][2] = line.substring(thirdFieldStart).trim(); // Zip 
} 

使用正則表達式將是可能的,但它會更復雜。而正則表達式將無法區分人的姓名和城市的名字呢:

考慮這種情況下:

 
John Long-name Joe New York 21003 

你怎麼知道的名字是John Long-name Joe而不是John Long-name Joe New,如果你不知道做第一個字段的長度不超過20個字符? (注意John Long-name Joe是長度爲19個字符,在New York離開它和New之間有一個空格)

當然,如果你的領域是由其他字符分隔(如製表符\t),您可以拆分根據每條線路。而且很容易修改上面的代碼,以適應=)

由於我上面提出的解決方案是簡單的,我猜你可能想嘗試它,而不是=)

+0

Thx!雖然它現在可以工作,但基於固定長度的解析可能在將來不會起作用。文本文件中的一小部分更改(更多空間或刪除空格)會破壞代碼。 – user3084618

+0

如果需要,您可以嘗試從頭文件中「學習」所需的空間數量。否則,正則表達式不可能區分人名和城市名稱。無論如何,你仍然需要一些基於字符的約束。 – justhalf

+0

您可以檢查我對識別字段長度的編輯。 – justhalf