我的作业很早就让我难以接受,其余部分相当容易(导入后对数据进行排序,然后再以不同的名称再次保存)。
我们需要将.txt文件中的数据导入3个单独的数组(名称,吉祥物,别名),但这些行不一致。一致,我的意思是一行可能有:
Glebe,G Shield,Glebe District
虽然另一行可能有:
St George,Knight & Dragon,Saints,Dragons,St George Illawarra
第一个之前的所有内容属于名称数组。
第一个之后但第二个之前的所有东西属于吉祥物数组。
第二个之后的所有内容,直到该行的末尾属于别名数组。
我已经能够计算出如何导入.txt文件,其中包含整行,然后我可以将其转换为导入所有内容之前的“,”和新行(使用分隔符)。但是,包含3组以上数据的行会破坏导入,因为别名数组最终只保留1而不是其他所有数据。
因此有人知道并且可以向我展示一个几乎可以做到的代码:
name =第一个之前的所有内容,
Mascot =第一个之后但在第二个之前的所有内容
Alias =第二个之后的所有内容,直到行的结尾
我可以用作基础来加入我的工作吗?
经过一天的研究,我不断提出死路一条。它们通常都涉及拆分每个逗号,但会中断导入(带有多个别名的行,第二个别名放入名称数组,等等)
这是我想出的代码,它将整行导入数组:
public static void LoadData() throws IOException
{
String clubtxt = ("NRLclubs.txt");
String datatxt = ("NRLdata.txt");
int i, count;
File clubfile = new File(clubtxt);
File datafile = new File(datatxt);
if (clubfile.exists())
{
count = 0;
Scanner inputFile = new Scanner(clubfile);
i = 0;
while(inputFile.hasNextLine())
{
count++;
inputFile.nextLine();
}
String [] teamclub = new String[count];
inputFile.close();
inputFile = new Scanner(clubfile);
while(inputFile.hasNext())
{
teamclub[i] = inputFile.nextLine();
System.out.println(teamclub[i]);
i++;
}
inputFile.close();
}
else
{
System.out.println("\n" + "The file " + clubfile + " does not exist." + "\n");
}
if (datafile.exists())
{
count = 0;
Scanner inputFile = new Scanner(datafile);
i = 0;
while(inputFile.hasNextLine())
{
count++;
inputFile.nextLine();
}
String [] teamdata = new String[count];
inputFile.close();
inputFile = new Scanner(datafile);
while(inputFile.hasNext())
{
teamdata[i] = inputFile.nextLine();
System.out.println(teamdata[i]);
i++;
}
inputFile.close();
}
else
{
System.out.println("\n" + "The file " + datafile + " does not exist." + "\n");
}
}
答案 0 :(得分:1)
使用参数limit
查看String.split
方法。
如果您的输入行位于名为line
的变量中,则可以调用
String[] tokens = line.split(',', 3);
这将分割逗号上的行,同时确保它不会返回超过3个令牌。它返回一个String数组,其中第一个元素将在第一个逗号之前,第二个元素将在第一个和第二个逗号之间,第三个元素将在第二个逗号之后。
答案 1 :(得分:1)
由于您只想解析前两个逗号,因此可以使用字符串split
并设置限制。
如果您愿意,可以使用String indexOf
方法查找前2个逗号,然后使用String substring
方法获取逗号之间的字符。
您希望能够使用一个逗号处理一行,或者根本不处理任何逗号。
这是解析String line的一种方法
public List<String> splitLine(String line) {
List<String> list = new ArrayList<String>();
int firstPos = line.indexOf(",");
int secondPos = line.indexOf(",", firstPos + 1);
if (firstPos >= 0) {
if (secondPos >= 0) {
list.add(line.substring(0, firstPos));
list.add(line.substring(firstPos + 1, secondPos));
list.add(line.substring(secondPos + 1));
} else {
list.add(line.substring(0, firstPos));
list.add(line.substring(firstPos + 1));
list.add("");
}
} else {
list.add(line);
list.add("");
list.add("");
}
return list;
}
答案 2 :(得分:0)
您可以使用String.split方法。
String line = // the line you read here
// Split on commas but only make three elements
String[] elements = line.split(',', 3);
// The first belongs to names
names[linecount] = elements[0];
// The second belongs to mascot
mascot[linecount] = elements[1];
// And the last belongs to aliases
aliases[linecount] = elements[2];
答案 3 :(得分:0)
基本上你要做的是在读取数据时将每一行拆分成一个数组,然后逐行解析数据。像这样的东西(伪代码):
Scanner inputFile = new Scanner(datafile);
while(inputFile.hasNextLine()) {
String line = inputFile.nextLine();
String[] lineSplit = line.split(",");
//TODO: make sure lineSplit is at least 3 long.
String name = lineSplit[0];
String mascot = lineSplit[1];
//EDIT: Don't just get the last element, get everything after the first two.
// You can do this buy just getting the substring of the length of those two strings
// + 2 to account for commas.
//String alias = lineSplit[lineSplit.length() - 1];
String alias = line.substring(name.length() + mascot.length() + 2);
//If you need to do trimming on the strings to remove extra whitespace, do that here:
name = name.trim();
mascot = mascot.trim();
alias = alias.trim();
//TODO: add these into the arrays you need.
}
希望这有帮助。
答案 4 :(得分:0)
尝试查看模式/匹配器 - 你需要提出一个合适的正则表达式。
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
这样的事可能会这样做:
static final Pattern pattern = Pattern.compile("([^,]*),([^,]*),(*$)");
MatchResult result = pattern.matcher(line).toMatchResult();
if (result.groupCount() == 3) {
// Found the groups
name = result.group(0);
// etc..
} else {
// failed to match line
}