【问题标题】:How to import a very large csv file into an existing SQL Server table?如何将非常大的 csv 文件导入现有的 SQL Server 表?
【发布时间】:2012-01-09 20:07:21
【问题描述】:

我有一个非常大的 csv 文件,其中包含约 500 列、约 350k 行,我正在尝试将其导入现有的 SQL Server 表中。

我试过BULK INSERT,我得到了-Query executed successfully, 0 rows affected。有趣的是,BULK INSERT 在几秒钟内就完成了类似的操作,但 csv 文件要小得多,不到 50 列,约 77k 行。

我也试过bcp,我得到了-Unexpected EOF encountered in BCP data-file. BCP copy in failed

任务很简单 - 应该不难达到纯粹的挫败感。有什么想法或建议吗?您已成功用于完成批量导入操作或类似操作的任何其他工具、实用程序?谢谢。

-- 批量插入

USE myDb  
BULK INSERT myTable  
FROM 'C:\Users\myFile.csv'  
WITH  
(  
FIRSTROW = 2,  
-- DATAFILETYPE = 'char',  
-- MAXERRORS = 100,  
FIELDTERMINATOR = ',',  
ROWTERMINATOR = '\n'  
);

--bcp

bcp myDb.dbo.myTable in 'C:\Users\myFile.csv' -T -t, -c

更新
我现在改变了方向。我决定在 SQL Server 之外加入 csv 文件,这是我开始的目标,这样我现在不必将数据上传到表中。但是,尝试从 csv 文件上传(BULK INSERT 或“bcp”)仅 1 条记录(约 490 列)会很有趣,否则会失败,看看它是否有效。

【问题讨论】:

  • 您需要提供更多信息。你正在为BULK INSERTbcp 运行什么命令?
  • 可能是文件本身损坏/不正确。
  • @JNK, USE myDb BULK INSERT myTable FROM 'C:\Users\myFile.csv' WITH ( FIRSTROW = 2, -- DATAFILETYPE = 'char', -- MAXERRORS = 100, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' );
  • @MickyWalia - 用代码标签把它放在你的问题中,这样它就可以阅读了。
  • @JNK,我正在编辑它 - 误按 Enter。

标签: sql sql-server csv bulkinsert bcp


【解决方案1】:

检查文件中不应该出现的 EOF 字符 - BCP 告诉您文件存在问题。

Notepad ++ 或许能够加载文件供您查看和搜索。

【讨论】:

  • 谢谢,但我已经尝试过了……文件没有问题,没有意外的 eof 字符。
【解决方案2】:

最后一行很可能缺少\n。此外,SQL-Server 中的行大小(8060 字节)有限制,尽管 T-SQL 应该提到这一点。但是,请检查此link

我的建议:从一排开始,然后让它发挥作用。然后剩下的。

【讨论】:

    【解决方案3】:

    您如何将文件中的字段与表中的列进行映射?表中的列数是否与文件中的字段数相同?或者您是否使用格式文件来指定列映射?如果是,格式文件的格式是否正确?

    如果您使用的是格式文件,并且“列数”参数错误,则会导致错误“文件意外结束”。 See this for some other errors/issues with bulk uploading.

    【讨论】:

    • 表中的列数与数据文件中的字段数相同。我没有使用格式文件 - 当我在较小的 csv 上执行 BULK INSERT 时,我没有使用格式文件。
    【解决方案4】:

    这可能不是您期望的解决方案,但使用 Python,您可以非常轻松地从 csv 中创建一个表(只需上传一个 1GB 的 CSV 文件):

    import pandas as pd
    import psycopg2
    from sqlalchemy import create_engine
    
    # Read the csv to a dataframe
    df = pd.read_csv('path_to_csv_file', index_col='name_of_index_column',  sep=",") 
    
    # Connect and upload
    engine = create_engine('postgresql+psycopg2://db_user_name:db_password@localhost:5432/' + 'db_name', client_encoding='utf8')
    df.to_sql('table_name', engine, if_exists='replace', index =True, index_label='name_of_index_column')
    

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      相关资源
      最近更新 更多