0

我希望这是有道理的,但我需要一些帮助。我从我们的一位客户那里收到了一个 CSV 文件,但他们没有向我们发送标准格式的文件。在大多数情况下,该文件包含 1 列,最多有一百万行,但有时他们会向我们发送多列,每列有一百万行左右。我的猜测是他们正在使用 Excel 并保存为 CSV。

我的问题是如何清理文件,这样我们就不必手动将其更改为一列?现在我SqlBulkCopy用 a 做 a DataTable。这也没有标题记录。

如果需要,我愿意以编程方式使用 SSIS,或者只是在 tsql 中执行逻辑,但不希望这样做。我更愿意在我的 c# 应用程序中执行此操作。一位同事建议导入一个导入保存表并使用联合获取一列,然后插入用于其他逻辑的表中。请帮忙?!?

编辑: 我认为一个例子在这里会很有用,所以这是我的尝试:

文件是这样的:aa, bb, cc, dd

我希望它看起来像这样:aa bb cc dd

注意:列将是固定宽度,但列数是动态的。

编辑#2:我最终为此做了不同的路线,主要是因为时间限制。我所做的是创建了一个包含 25 列的导入临时表。我曾经SqlBulkCopy为此映射列。列映射将取决于中的列数,DataTable我只是foreach为此使用 a。

然后我调用一个存储过程来“处理”记录,方法是UNION ALL为每一列执行一个并导入到最终表中。这也有助于解决有时有标题记录的问题,有时一列中会有空白,因为它没有以前的那么长。由于生产中的字段有唯一性约束,所以不能有多个空记录。

不优雅,但我让它工作。

4

3 回答 3

1

在此处输入图像描述 根据您的要求,这是一个更通用的解决方案。将我之前的解决方案中的 OLEDB 源替换为平面文件。然后按照图中描述的步骤进行操作。

于 2013-09-18T01:13:48.883 回答
0

您可以使用像http://blogs.msdn.com/b/jmstall/archive/2012/03/24/opensource-csv-reader-on-nuget.aspx这样的库,将数据读入 IEnumerable。接下来使用 Linq 选择运算符返回字段。

var resultField1 = reader.Select(row => row.field1);

var resultField2 = reader.Select(row => row.field2);


var combined = resultField1.Concat(resultField2);

combined.ToList().ForEach(r => DataTableToUpload.NewRow({r});

使用组合数据,您可以轻松地将 dq=ata 添加到数据表中。

于 2013-09-17T00:50:02.803 回答
0

您可以使用异步脚本组件。一个样本在这里。您可以智能地检测列数并相应地添加这些行数。练习它,如果您需要帮助,请告诉我们。 在此处输入图像描述

另一种方法是将数据放在临时表中,然后合并两列。同样,如果您可以计算出列数,您可以在脚本任务中组装此 sql,并将该 sql 保存在一个变量中。

SELECT f1 AS OneColumn FROM [dbo].[TempTable]
UNION ALL
SELECT f2 AS OneColumn  FROM [dbo].[TempTable]
于 2013-09-17T01:14:06.013 回答