我有一个分号分隔的输入文件,其中第一列是3字符固定宽度代码,而其余列是一些字符串数据。

001;first_data_str;second_data_str;third_data_str;fourth_data_str
001;first_data_str;second_data_str;third_data_str;fourth_data_str
002;first_data_str;second_data_str;third_data_str;fourth_data_str
003;first_data_str;second_data_str;third_data_str;fourth_data_str
001;first_data_str;second_data_str;third_data_str;fourth_data_str
003;first_data_str;second_data_str;third_data_str;fourth_data_str
001;first_data_str;second_data_str;third_data_str;fourth_data_str
002;first_data_str;second_data_str;third_data_str;fourth_data_str
002;first_data_str;second_data_str;third_data_str;fourth_data_str
003;first_data_str;second_data_str;third_data_str;fourth_data_str
003;first_data_str;second_data_str;third_data_str;fourth_data_str
003;first_data_str;second_data_str;third_data_str;fourth_data_str
002;first_data_str;second_data_str;third_data_str;fourth_data_str
001;first_data_str;second_data_str;third_data_str;fourth_data_str

我想根据第一列的不同值将上面的文件划分为多个文件。

例如,在上面的示例中,第一列中有三个不同的值,因此我将文件分成三个文件即。 001.txt,002.txt,003.txt

输出文件应包含项目计数作为第一行,数据作为剩余行。

所以有5 001行,所以001.txt将是:

5
first_data_str;second_data_str;third_data_str;fourth_data_str
first_data_str;second_data_str;third_data_str;fourth_data_str
first_data_str;second_data_str;third_data_str;fourth_data_str
first_data_str;second_data_str;third_data_str;fourth_data_str
first_data_str;second_data_str;third_data_str;fourth_data_str

类似地,002文件将第一行作为4然后4行数据和003文件将第一行作为5行,然后是5行数据。

考虑到超过100,000行的超大输入文件,最有效的方法是什么?

我写了下面的代码来读取文件中的行:

try{
          FileInputStream fstream = new FileInputStream(this.inputFilePath);
          DataInputStream in = new DataInputStream(fstream);
          BufferedReader br = new BufferedReader(new InputStreamReader(in));
          String strLine;

          while ((strLine = br.readLine()) != null)   {
              String[] tokens = strLine.split(";");
         }

          in.close();
    }catch(IOException e){
        e.printStackTrace();
    }

#1楼 票数:1

  • 对于每一行
  • 提取块名称,例如001
  • 查找名为“001-tmp.txt”的文件
  • 如果存在,则读取第一行 - 它将给出行数,然后递增该值并使用带参数0的搜索函数写入同一文件,然后使用writeUTF覆盖该字符串。 也许这里必须应用一些字符串长度计算,例如留下10个空格的占位符。
  • 如果一个不存在,则创建一个并将1写为第一行,填充10个空格
  • 将当前行附加到文件
  • 关闭当前文件
  • 继续下一行源文件

#2楼 票数:1

想到的解决方案之一是保持“地图”并且只打开一次文件。 但是你无法做到这一点,因为你有大约1个lac行,所以没有OS会允许你那么多打开文件描述符。

因此,其中一种方法是以追加模式打开文件并继续写入并关闭它。 但由于大量文件打开了近距离通话,这个过程可能会放慢速度。 你可以为自己测试它。

如果以上结果不能提供令人满意的结果,您可以尝试混合使用方法1和方法2,其中您只能在任何时间打开100个打开的文件,只有在尚未打开的新文件需要写入时才关闭文件....

#3楼 票数:0

对于每个三个字符的代码,您将获得一个输入行列表。 对我来说,显而易见的解决方案是使用Map ,其中String键(您的三个字符代码)指向包含所有行的相应List

对于每个键,您将创建一个具有相关名称的文件,第一行将是列表的大小,然后您将迭代它以写入剩余的行。

#4楼 票数:0

我猜你没有固定三个文件所以我建议你创建一个作家地图,你的三个字符代码作为键,作者作为值。

对于您阅读的每一行,您可以选择或创建所需的阅读器并将行写入。 您还需要第二个映射来维护所有文件的行计数值。

完成阅读源文件后,刷新并关闭所有编写器并再次逐个读取文件。 这次您只需在文件前添加行数。 除了根据我的知识重写整个文件之外别无他法,因为它不能直接在文件的开头添加任何内容而不需要缓冲和重写整个文件。 我建议你使用一个临时文件。

此答案仅适用于文件太大而无法完全存储在内存中的情况。 如果可以存储,可以有更快的解决方案。 就像在将文件内容写入文件之前将其完全存储在StringBuffer对象中一样。

#5楼 票数:0 已采纳

首先,创建HashMap<String, ArrayList<String>> map以收集文件中的所有数据。 其次,使用strLine.split(";",2)而不是strLine.split(";") 结果将是长度为2的数组,第一个元素是代码,第二个元素是数据。 然后,将解码后的字符串添加到地图中:

ArrayList<String> list=map.get(tokens[0]);
if (list==null) {
   map.put(tokens[0], list=new ArrayList<String>();
}
list.add(tokens[1]);

最后,扫描map.keySet()并为每个键创建一个名为该键的文件,并将列表的大小和列表的内容写入其中。

  ask by Vicky translate from so

未解决问题?本站智能推荐:

3回复

从文件中读取一个数组列表,然后将数组列表分成多个字符串,这样我就可以分别解析它们

因此,对于我的作业,我必须从Java外部的文件中提取信息。 我已经完成了那部分。 问题是我不确定如何将文件中的字符串实际放入将用于下一部分的变量或循环中。 在下面的代码中,我需要用outfile中的单行替换表示Item = Tomato ...的代码部分。 我不确定该怎么做。 我主要关
2回复

Java-将文件分成多个部分

我正在一个项目中,以采取一个文件,并保存其部分。 部分可以是 1。 2。 3。 等,但也可以是 1.1 2.3.1.II. 等等 现在,我知道如何阅读的基本知识。 我需要知道是否有一种很好的方法来检测文本并将其分成多个部分。 我考虑过正则表达式,但是我不知
7回复

将多个文件合并为一个

我在一些位置有4个不同的文件,如:D:\\ 1.txt D:\\ 2.txt D:\\ 3.txt和D:\\ 4.txt 我需要创建一个新文件NewFile.txt ,它应该包含上述文件中存在的所有内容1.txt,2.txt,3.txt 4.txt ....... 所有数据都应出现在Ne
4回复

使用JAVA读取文件夹中的多个文件

我正在尝试将位于文件夹(在 eclipse 包 src/myFolder 内)中的文本文档读入 String[]。 我怎样才能做到这一点? 我应该使用 bufferedReader 还是 Scanner? 文档中的每个单词都必须标记为文档 ID。 例如:如果第一个文档的句子是“春天来了”,而第二个文
3回复

javasplitstring[]数组到多个文件

我在弄清楚如何将字符串拆分为多个文件时遇到了问题。 目前我应该获得两个带有JSON数据的文件。 下面的代码写入第一个文件,但第二个文件留空。 有什么想法吗? 编辑:它以{开头的行分割,因为它表示JSON文档的结尾。
2回复

使用Java无法匹配文件中的第一个单词

我正在尝试匹配数组中的单词以创建用于词法分析的符号表(编译器实验室)。 我正在从Java读取C代码文件。 我可以从文件中找到所有内容,但第一个单词除外。 不管我尝试什么,尽管第一个单词是一个有效单词,但它与任何单词都不匹配。 在我的文件中,第一个单词是int(两个变量的初始化),第二行是
2回复

从Java文件中删除最后一个换行符

我想使用Java删除文件中存在的最后一个换行符。 我的意思是,文件的末尾有一个换行符,我想删除它。 我尝试了许多在线提供的解决方案,但是没有任何效果。 下面的代码从文件中删除所有换行符 示范文本: 上面的示例末尾有换行符。 我已引用以下网址: http://www.ava
1回复

如何处理带有int和string的输入文件[重复]

这个问题已经在这里有了答案: 如何将文件逐行读取到列表中? 28个答案 如何在Java中拆分字符串 34答案 如何在Java中将String转换为int? 42个答案 在每周的实验/作业中,我被要求处理一个文本文件,然后使用jdbc将其推送到数据库中。 首