![](/img/trans.png)
[英]loading data file with 3 spaces as delimiter using Sparks csv reader in java
[英]Java delimiter reader
我有一個冒號分隔的文本文件,其中包含結構化的分組數據。 “ People
組包含人名,后跟年齡,以冒號分隔。 如何解析文本並根據人的年齡對人進行分組?
結構如下:
Group.txt
Age:10:20:30:40:
Group:G1:10:G2:30:G3:20:G4:40:
People:Jack:10:Tom:30:Dick:20:Harry:10:Paul:10:Peter:20:
People:Mary:20:Lance:10:
我希望顯示如下內容:
G1 Jack Harry Paul Lance
G2 Dick Peter Marry
G3 Tom
G4
我建議首先創建一個具有相應年齡的所有組的Map
。
為此,您可以使用一個Regex
,它可以獲取左側的alphanumeric
字符串,以及colon
右側的digit
,用於以Group
開頭的行。
我懷疑這些行來自你的文件。 因此,首先您需要檢查您的行是否以Group
開頭。 然后在該行應用以下正則表達式: -
"([A-Za-z0-9]+):(\\d+)" // Matches `G1:10`, `G2:30`, ...
然后將所有匹配字符串的group 1
和group 2
添加到Map<String, Integer>
現在,對於以People
開頭的其他行,應用類似的正則表達式,但只使用colon
左側的alphabetic characters
,然后從已創建的Map
獲取特定年齡的group
。
"([A-Za-z]+):(\\d+)" // Matches `John:22`
可能這會讓你開始。
更新:
根據您的最新編輯,我建議創建一個包含3個屬性的Group
類:
class Group {
private String groupName;
private int age;
private List<String> people;
}
而不是創建Map<String, Integer>
,而是創建Map<Integer, Group>
。 你的工作會更容易。 Integer
是age
。
因此,當您獲得具有特定age
的Person
age
,從該age
的Map
獲取組對象,並使用該人更新該group object
的List<String>
。
請試一試,看看你是否可以解決它。
您可以使用StringTokenizer拆分行,然后創建一個實現Comparable Interface的“People”類。
這些應該至少讓你開始。
你可以拆分字符串:
String[] items = row.split(":");
if (items[0].equals("Age")) {
// items[1] and onwards consists of Ages
}
if (items[0].equals("Group")) {
// items[1] and onwards consists of group name/numbers
}
等等
創建一個包含人員信息的新課程。 (這個可以工作,但為了保持簡短,打破了一堆好的做法。閱讀POJO,了解如何將屬性設為私有的更多細節,如果你願意,可以添加訪問者方法。這是一個不同的討論。
public class Person { public String name; public int age; }
然后,您可以使用此新類將人員信息存儲到稍后可以訪問的列表中。
當您遍歷文件時,當您找到以People:
開頭的行時,您可以使用以下代碼解析它:
List<Person> people = new ArrayList<Person>();
String str = "People:Mary:20:Lance:10:"; // Replace with the line you read from the file
Pattern p = Pattern.compile("(?:([^:]*):(\\d*):)");
Matcher m = p.matcher(str);
while(m.find()) {
for(int i=1; i<=m.groupCount(); i+=2) {
Person p = new Person();
p.name = m.group(i);
p.age = new Integer(m.group(i+1));
people.add(p);
}
}
// At this point, all your people are store into the list.
我會將這項任務分解成碎片。 首先,找到所有組:
/^Group:(G[0-9]+:[0-9]+)*/
從該行獲取第一個捕獲組,將每個匹配分開:
,然后您將每個組的名稱映射到相應的年齡。
接下來,與人類似的東西:
/^People:([A-Za-z]+:[0-9]+)*/
像以前一樣進行匹配,分組和分割,現在您將每個人映射到他或她的年齡。 從那里,您所要做的就是為每個年齡段制作一個桶,按年齡對桶進行排序,並將每個人放在適當的桶中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.