将 csv 导入 SQL Server 表

Posted

技术标签:

【中文标题】将 csv 导入 SQL Server 表【英文标题】:Import csv into SQL Server table 【发布时间】:2021-02-04 13:42:39 【问题描述】:

我很久以前是一名开发人员,后来进入了管理职位,但又回到了一个新的岗位上做一些轻量级的开发。

我遇到的问题是我需要将.csv 文件导入到 SQL Server 表中以进行进一步处理,我正在处理该表,但其中一列可能有一个“,”,这会导致导入失败。

我知道只要我强制删除“,”它就可以工作,但需要能够以编程方式执行此操作。该文件来自外部来源,因此很遗憾,我无法更正来源或在列周围放置“”作为分隔符。

任何帮助或建议将不胜感激。

PS:请记住,我正在重新学习内容,因此您可能不得不“忽略”任何建议。 ;)

史蒂夫

【问题讨论】:

计算机不会有意识或上下文来知道逗号是值的一部分而不是分隔符。您需要预处理 CSV 文件以在包含逗号的值周围添加引号。您已经建议这可能是一个解决方案,因此我不会对此进行详细介绍,因为您似乎已经知道了。理想情况下,应首先纠正外部源以停止生成格式错误的 CSV 文件。 你用什么来读取你的 CSV 文件?您的 CSV 格式不正确(即,包含逗号的数据没有被引用)或者您用于读取 CSV 的内容已损坏。 在标准 CSV 中,当数据中有逗号时,该字段必须用引号括起来。首先检查文件的格式是否正确,如果不是,请制作者提交正确的格式。 从具有 csv 输入功能的 bat 文件运行 sqlcmd.exe。运行速度比在 c# 中执行相同操作要快得多。您可以从 c# Process Class 运行 bat 文件。 SQLCMD 命令也在 PowerShell 中。请参阅:docs.microsoft.com/en-us/sql/tools/… 除了其他评论者的明智建议之外,听起来您的限制是您无法影响源文件并且开箱即用的工具不支持您的情况,那么您需要滚动您的自己的方法。 主张编写一个预处理器步骤,该步骤采用格式错误的 CSV 并生成格式良好的 CSV。它可以像readline -> split on comma => if split count is expected, recombine; if split count is one greater than expected, merge columns N and N+1 and then recombine 这样简单,这种方法的优点是您可以将原始输入与新输入进行比较 【参考方案1】:

如果您使用 c#,您实际上可以做的是确定逗号的确切位置,例如,如果您有这样的表:

Apple,Peach,Raspberry
Apple,Banana,grape
Tomato,Pe,ch,Raspberry

如果你可以看到通常有 3 列由逗号分隔,并且在第 3 列中 Peach 单词中有一个额外的逗号,所以如果逗号总是出现在第二列,你可以计算每行的单词数:

var contents = File.ReadAllText(filename).Split('\n');
//you can use linq
var csv = from line in contents select line.Split(',').ToArray();
var count = contents.Split(',').Length; 

//通常它总是计数为 3,但是当它计数为 4 时,您可以在该列上使用 if 条件:

if(count > 3)

col2 = csv[1] + csv[2]


我的意思是这只是想法和快速答案,但取决于您执行此操作的方式,您只需要找到该 CSV 的正确模式,以便您弄清楚如何解决!

【讨论】:

以上是关于将 csv 导入 SQL Server 表的主要内容,如果未能解决你的问题,请参考以下文章

把csv文件导入到SQL Server表中

将日期导入SQL Server表

BULK INSERT将CSV或TXT文件导入到SQL Server

将 CSV 文件导入 SQL Server

如何把csv文件导入到sql数据库

PowerShell-将CSV导入SQL Server