【问题标题】:Loading CSV data using SQLServerBulkCSVFileRecord with enclosing and nulls使用带有封闭和空值的 SQLServerBulkCSVFileRecord 加载 CSV 数据
【发布时间】:2018-08-16 13:10:15
【问题描述】:

我正在尝试使用 SQLServerBulkCSVFileRecord 加载 CSV 数据,但似乎这不允许包含字段(去除引号)并提供 NULL 值。

关于如何使它工作的任何建议?似乎是加载 CSV 文件所需的基本功能。

我目前正在使用的代码:

final SQLServerBulkCopy copymanager = new SQLServerBulkCopy(connection);
final SQLServerBulkCSVFileRecord csv = new SQLServerBulkCSVFileRecord(datafile.toString(), true);

final ResultSet resultSet = connection.createStatement().executeQuery(
        String.format("select * from [%s].[%s]", getSchema(), tableName));
for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) {
    csv.addColumnMetadata(i, resultSet.getMetaData().getColumnName(i), resultSet.getMetaData().getColumnType(i),
            resultSet.getMetaData().getPrecision(i), resultSet.getMetaData().getScale(i));
}

copymanager.setDestinationTableName(tableName);
copymanager.writeToServer(csv);

【问题讨论】:

    标签: c# sql-server csv jdbc sqlbulkcopy


    【解决方案1】:

    有趣的是,SQLServerBulkCSVFileRecord 的源代码有一个comment

    • BCP 和 BULK INSERT 都将双引号视为数据的一部分,如果要包含任何数据(例如“10”),则会引发错误
    • 已插入数字列。我们的实现也是如此。

    这意味着您必须解析代码中的每一行以取消引用引用的值。

    至于为 NULL 提供一个值,您可以在您的代码中执行此操作,我们在表中提供一个 DEFAULT 值。您的选择。

    【讨论】:

    • 嗯,谢谢,但仍然丑陋...例如。 Postgresql 驱动程序有一个选项来定义封闭字符,甚至是可选的,并且可以为 null 定义一个字符串值。
    • stackoverflow.com/questions/1405038/reading-a-csv-file-in-net 提到使用 .NET 类来解析 csv,这可能对您有所帮助
    • 我最终使用了带有 InputStream 的 SqlBulkCopy 类,并在没有 qoutes 和未使用的分隔符的情况下重写了原始文件。
    • 也许我现在最终扩展了 SQLServerBulkCSVFileRecord 并基于 FastCSV 构建后端... 看起来更无缝;有兴趣的可以分享部分代码。
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多