首选方法 re-ordering csv files by row in Java
Preferred method re-ordering csv files by row in Java
例如,假设您有一个 csv 文件,其中 headers 位于文件底部,例如:
1,2,3,4
1,2,3,4
1,2,3,4
a,b,c,d
您想按原样重新排序
a,b,c,d
1,2,3,4
1,2,3,4
1,2,3,4
我基本上有两种方法可以做到这一点我想知道哪种方法在内存使用方面更有效。我怀疑是第一种情况,但想知道是否有不同意见。
第一种方法:
- 遍历文件,直到我们到达最后一行,将其存储在一个变量中。
- 将变量写入文件
- 再次遍历文件,写入除最后一行之外的每一行。
第二种方法:
- 遍历文件,将每一行存储为数组列表中的一个项目
- 将数组列表中的最后一项写入文件
- 遍历 arraylist 将除最后一项之外的每一项写入文件。
当你需要随机访问数据集中的变量时(这是 'DOM' 方式),我总是被教导将东西放在内存中(第二种方式),而如果你只是 reading/writing 文件使用第一种方式(xml 术语中的 'SAX' 方式),我不禁想到必须遍历数据集两次(第一种方式)真的很草率。有没有更好的方法来做到这一点?
从流中读取文件并将其写入另一个流。在这样做的同时,请记住将最后一行写为第一行。删除原文件,将副本重命名为原文件。
为此,您必须将第一个文件的所有内容存储到一个变量中:字符串、ArrayList 或类似的东西。
如果您想将某些内容附加到文件,只需以 附加模式打开它:
new BufferedWriter(new FileWriter(PATH, true));
但这不是你要找的。
根据文件的大小,您可以这样做
static final Charset FILE_ENCODING = StandardCharsets.UTF_8;
List<String> inLines = Files.readAllLines(Paths.get("input.csv"), FILE_ENCODING);
inLines.add(0, inLines.get(inLines.size()-1));
inLines.remove(inLines.size()-1);
Files.write(Paths.get("output.csv"), inLines, FILE_ENCODING);
我会尝试使用 RandomAccessFile:
1、求到底。
2.向后读取头部(不直接支持,但可以逐字节完成)。
3. 将文件头写入新文件。
4. 查找到原始文件的开头(或使用 FileReader 再次打开它)。
5. 遍历文件写入结果文件,除了最后一行。
不确定它是否更快,但可以。
例如,假设您有一个 csv 文件,其中 headers 位于文件底部,例如:
1,2,3,4
1,2,3,4
1,2,3,4
a,b,c,d
您想按原样重新排序
a,b,c,d
1,2,3,4
1,2,3,4
1,2,3,4
我基本上有两种方法可以做到这一点我想知道哪种方法在内存使用方面更有效。我怀疑是第一种情况,但想知道是否有不同意见。
第一种方法:
- 遍历文件,直到我们到达最后一行,将其存储在一个变量中。
- 将变量写入文件
- 再次遍历文件,写入除最后一行之外的每一行。
第二种方法:
- 遍历文件,将每一行存储为数组列表中的一个项目
- 将数组列表中的最后一项写入文件
- 遍历 arraylist 将除最后一项之外的每一项写入文件。
当你需要随机访问数据集中的变量时(这是 'DOM' 方式),我总是被教导将东西放在内存中(第二种方式),而如果你只是 reading/writing 文件使用第一种方式(xml 术语中的 'SAX' 方式),我不禁想到必须遍历数据集两次(第一种方式)真的很草率。有没有更好的方法来做到这一点?
从流中读取文件并将其写入另一个流。在这样做的同时,请记住将最后一行写为第一行。删除原文件,将副本重命名为原文件。
为此,您必须将第一个文件的所有内容存储到一个变量中:字符串、ArrayList 或类似的东西。
如果您想将某些内容附加到文件,只需以 附加模式打开它:
new BufferedWriter(new FileWriter(PATH, true));
但这不是你要找的。
根据文件的大小,您可以这样做
static final Charset FILE_ENCODING = StandardCharsets.UTF_8;
List<String> inLines = Files.readAllLines(Paths.get("input.csv"), FILE_ENCODING);
inLines.add(0, inLines.get(inLines.size()-1));
inLines.remove(inLines.size()-1);
Files.write(Paths.get("output.csv"), inLines, FILE_ENCODING);
我会尝试使用 RandomAccessFile: 1、求到底。 2.向后读取头部(不直接支持,但可以逐字节完成)。 3. 将文件头写入新文件。 4. 查找到原始文件的开头(或使用 FileReader 再次打开它)。 5. 遍历文件写入结果文件,除了最后一行。
不确定它是否更快,但可以。