如何解析包含大量记录的文本文件中的数据,每个值由空格/制表符或两者分隔

时间:2011-11-11 10:29:36

标签: java parsing file-handling

我实际上需要创建一个包含421列的数据库并创建它。现在我必须使用Java程序将数据加载到数据库中。我需要输入到数据库中的数据存在于文本文件中。文本文件中的值由空格/制表符分隔,或者可以是两者。如何从此文本文件中提取数据,以便在column1下输入第一个值,在第2列下输入第二个值,依此类推....列421下的第421个值和第1列下的第422个值,依此类推。我在文件处理和java解析方面很差,所以请帮忙。

2 个答案:

答案 0 :(得分:0)

为什么你不用sql语句?下面是mysql的例子,我将分隔符显示为tab:

LOAD DATA LOCAL INFILE '/importfile.csv'
INTO TABLE test_table
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
(field1, filed2, field3); 

http://dev.mysql.com/doc/refman/5.0/en/load-data.html

编辑:

如果分隔符是可选的,也许您可​​以通过缓冲读取器读取分析?我没有检查代码,但你可以写这样的东西,并在循环中检查文本。我已将所有选项卡替换为空格,然后我使用分隔符作为空格,但如果您的值包含空格,那么它就是问题

BufferedReader br = new BufferedReader(new FileReader("myText.txt"));

String s;

while((s=br.ReadLine)!= null){
   s.replace("\t"," ");
   String[] sub = s.split(" ");
   String statement = "insert into myTable (clm1, clm2, clm3) Values (";

   for(int i=0:i<sub.length;i++){
       if((i % 420) == 0){
         mySqlStatement.ExecuteQuery(statement);
         statement = "insert into myTable (clm1, clm2, clm3) Values (";
       }
       if(i==0){
          statement = statement + sub(i);
       }else{
          statement = statement + "," + sub(i);
       }
   }
   statement = statement + ")";
  mySqlStatement.ExecuteQuery(statement);
}

答案 1 :(得分:0)

421列?哇,你可能应该将那张巨大的桌子分成一个有关系的合适模型。但无论如何,那是偏离主题的。 如果你真的想用Java做这件事,有可能:

public static void readFromFile(String pathToFile) {
    final BufferedReader reader = getFileReaderInClasspath(pathToFile);
    try {
        String line = null;
        while ((line = reader.readLine()) != null) {
            final StringTokenizer tokenizer = new StringTokenizer(line, "\s\t");
            final List<String> columns = new ArrayList<String>();
            while (tokenizer.hasMoreTokens()) {
                columns.add(tokenizer.nextToken());
            }
            saveIntoDb(columns);
        }
        reader.close();
    } catch (IOException e) {
        throw new IllegalArgumentException("Error reading file (" + pathToFile + ")", e);
    }
}

显然,您需要实现将列插入数据库的saveIntoDb(List)方法。 或者,您可以将每个列列表存储到

List<List<String>>

,其中包含所有行,并且仅在流程结束时将所有行添加到数据库中。