【发布时间】:2013-09-16 21:50:43
【问题描述】:
我希望这是有道理的,但我需要一些帮助。我从我们的一位客户那里收到了一个 CSV 文件,但他们没有向我们发送标准格式的文件。在大多数情况下,该文件包含 1 列,最多有一百万行,但有时他们会向我们发送多列,每列有一百万行左右。我猜他们正在使用 Excel 并保存为 CSV。
我的问题是如何清理文件以便我们不必手动将其更改为一列?现在我用DataTable 做一个SqlBulkCopy。这个也没有头记录。
如果需要,我愿意以编程方式使用 SSIS 或仅在 tsql 中执行逻辑,但我不希望这样做。我更愿意在我的 c# 应用程序中执行此操作。一位同事建议导入一个导入保存表并使用联合来获取一列,然后插入用于其他逻辑的表中。请帮忙?!?
编辑: 我想一个例子在这里会很有用,所以这是我的尝试:
文件是这样的: aa, bb, cc, dd
我希望它看起来像这样: 啊 bb 抄送 dd
注意:列将是固定宽度,但列数是动态的。
编辑#2:我最终为此做了一条不同的路线,主要是因为时间限制。我所做的是创建了一个包含 25 列的导入临时表。我使用SqlBulkCopy 来映射列。列映射将取决于DataTable 中的列数,为此我只使用foreach。
然后我调用一个存储过程来“处理”记录,方法是为每一列执行UNION ALL 并导入到最终表中。这也有助于解决有时有标题记录的问题,有时一列中会有空白,因为它没有以前的那么长。由于生产中的字段有唯一性约束,所以不能有多个空记录。
不优雅,但我得到了它的工作。
【问题讨论】:
-
要手动解决这个问题,您是否剪切了第二列中的所有值并将它们粘贴到第一列的底部?
-
这是一个选项,但第一次发生这种情况时,我们制作了单独的文件并允许多选,并使用
foreach循环遍历所有内容。 -
是的,请解释当有多个列时应该发生什么。您是按照@David 的要求将其添加到末尾,您是连接 A1 和 B1 作为输出还是忽略 B 列?
-
第一次我们只是在 excel 中以 csv 格式打开文件,并为每一列创建了一个单独的文件。如果我们愿意,我们可以在记事本 ++ 之类的东西中连接,但是当您有大约 20 列时,这会变得过多。