将动态列csv解析为一列

时间:2013-09-16 21:50:44

标签: c# sql tsql csv ssis

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

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

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

修改: 我想一个例子在这里很有用,所以这是我的尝试:

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

我希望它看起来像这样: AA BB CC DD

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

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

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

不优雅,但我让它发挥作用。

3 个答案:

答案 0 :(得分:1)

enter image description here 根据您的要求,这是一个更通用的解决方案。用平面文件替换我以前的解决方案中的OLEDB源。然后按照图中描述的步骤进行操作。

答案 1 :(得分:0)

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

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添加到数据表中。

答案 2 :(得分:0)

您可以使用异步脚本组件。这是一个样本。您可以智能地检测列数并相应地添加这些行。练习,如果您需要帮助,请告诉我们。 enter image description here

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

SELECT f1 AS OneColumn FROM [dbo].[TempTable]
UNION ALL
SELECT f2 AS OneColumn  FROM [dbo].[TempTable]
相关问题