Java - 当行不一致时将文本文件导入到数组中

时间:2013-05-29 13:17:47

标签: java

我的作业很早就让我难以接受,其余部分相当容易(导入后对数据进行排序,然后再以不同的名称再次保存)。

我们需要将.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");
    }
}

5 个答案:

答案 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
}