【问题标题】:Split .csv file using mysql使用 mysql 拆分 .csv 文件
【发布时间】:2017-05-15 09:31:33
【问题描述】:

我有一个包含 100k 行的 .csv 文件,我使用 mysql 生成该文件。 我想将该文件拆分为较小的文件,每个文件包含 3k 行。 我如何使用 mysql 或 java 做到这一点?哪个更快? 我在 java 中找到了解决方案,但使用缓冲区读取器和缓冲区写入器需要 O(n^2)。

提前致谢。

【问题讨论】:

  • 这是最坏情况的 O(n) 问题。这个所谓的 O(n^2) 解决方案是什么?
  • @KevinAnderson 是不是读取缓冲区需要 O(n) 而外部需要 O(n) ?
  • 如果您从文件开头开始阅读并一直阅读到最后,则文件大小为 O(n)。如果你有一个循环也没关系,因为循环最多只运行 n 次;如果您一次阅读多个字符,则更少。如果您一次读取一个字符,则只有 O(n^2),每次从文件的开头开始。
  • @KevinAnderson 对,但我如何设法创建每个只有 3K 行的小文件?!

标签: java mysql csv


【解决方案1】:

使用 java 可以拆分文件 下面的示例使用 java 拆分文件。我更喜欢使用我们在我们的

中使用的 unix 脚本
public static void main(String[] args) throws IOException {

        String src="C:\\Users\\sahug\\Downloads\\split\\dumps.txt";
        String dest="C:\\Users\\sahug\\Downloads\\split\\";
        String fileName="MyFile";
        FileInputStream fis = new FileInputStream(str);
        int size = 20;
        byte buffer[] = new byte[size];

        int count = 0;
        while (true) {
            int i = fis.read(buffer, 0, size);
            if (i == -1)
                break;

            String filename = fileName + count;
            FileOutputStream fos = new FileOutputStream(dest+filename);
            fos.write(buffer, 0, i);
            fos.flush();
            fos.close();

            ++count;
        }
    }

【讨论】:

  • 谢谢。 (int size = 20) 这是否意味着新文件将有 20 行?!
  • 不是我在缓冲区数组中使用的文件的大小。这里 20 表示 20 个字节
  • 好的,但是我怎样才能让每个文件只包含 3k 呢?!
  • 使用 bufferreader 逐行读取,然后在达到阈值时写入文件
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 2016-06-07
  • 2021-05-21
  • 2018-05-04
  • 2013-03-04
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
相关资源
最近更新 更多