无法解析大列数据

Unable to parse large column Data

提问人:Blesson Xavier 提问时间:11/16/2023 最后编辑:Mark RotteveelBlesson Xavier 更新时间:11/16/2023 访问量:14

问:

我正在尝试使用 Java 应用程序解析 CSV,并在解析后尝试在 MySQL 表中插入值。代码片段如下。

问题是,当我解析一个文件时,该文件在引号下有一个非常大的 JSON 列,应用程序会冻结在具有大 JSON 的特定行上,然后退出而不会出现任何错误(在 bach 脚本中,它只是在下一行移动)。

我也附上了带有大块的 CSV 图片(CSV 中的第 3 行)。

完成插入的MySQL表具有相同的列名、类型和编码column_name TEXT DEFAULT NULLcharset=utf8mb4

包含大数据区块的标头message_payload

try (
    Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
    PreparedStatement preparedStatement = connection.prepareStatement(sqlInsertStatement);
    CSVReader csvReader = new CSVReader(new FileReader(csvFilePath))
) {
    connection.setAutoCommit(false); // Disable auto-commit for batch execution
    String[] headers = csvReader.readNext(); // Assuming the first line is the header
    String[] nextLine;

    while ((nextLine = csvReader.readNext()) != null) {
        j++;
        System.out.println("Line-----" + j);
        if (nextLine.length != headers.length) {
            mismatchLines_count++;
            continue; // Skip lines that do not have the same number of columns as the headers
        }

        for (int i = 0; i < headers.length; i++) {
            if (nextLine[i].length() > MAX_SIZE) {
                preparedStatement.setString(i + 1, nextLine[i].substring(0, MAX_SIZE));
            } else {
                preparedStatement.setString(i + 1, nextLine[i]);
            }
        }

        preparedStatement.addBatch();

        if (++count % batchSize == 0) {
            preparedStatement.executeBatch();
            connection.commit();
        }
    }

    if (count % batchSize != 0) {
        preparedStatement.executeBatch();
        connection.commit();
        System.out.println("Committing After Line :" + j);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        connection.setAutoCommit(true); // Re-enable auto-commit
    } catch (Exception e) {
        e.printStackTrace();
    }
}

CSV 的图像(删除敏感数据)

enter image description here

java mysql jdbc opencsv

评论

0赞 Mark Rotteveel 11/16/2023
请以代码格式的文本形式提供示例 CSV。我忘记了 OpenCSV 的默认值,但我认为您在转义/引用方面配置错误了。顺便说一句,明智的做法是将问题分为CSV解析与JDBC。例如,如果您只是尝试解析 CSV(并可能打印列或其他东西),会发生什么情况。它将简化您的代码并允许您找到问题。
0赞 siggemannen 12/7/2023
您可能应该增加堆内存。请参阅 stackoverflow.com/questions/1565388/increase-heap-size-in-java 或发布错误,冻结可能是由于 GC 运行造成的。CSVReader在内存处理方面不是很好,并且复制了大量数据,您可能希望实现自己的版本。另外,将 JSON 数据存储在 CSV 中是怎么回事?

答: 暂无答案