【问题标题】:Parse dynamic column csv into one column将动态列 csv 解析为一列
【发布时间】: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 列时,这会变得过多。

标签: c# sql tsql csv ssis


【解决方案1】:

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

【讨论】:

  • 在我实施了我的解决方案之后我确实尝试了这个,并且我能够让你的解决方案发挥作用。非常感谢您!
【解决方案2】:

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

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

SELECT f1 AS OneColumn FROM [dbo].[TempTable]
UNION ALL
SELECT f2 AS OneColumn  FROM [dbo].[TempTable]

【讨论】:

  • 如果我每次都有不同数量的列,这将如何工作?
  • 请看下面的附图。我已尝试描绘每一步,以便您轻松重现解决方案。这适用于任意数量的列。
【解决方案3】:

您可以使用像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 添加到数据表中。

【讨论】:

  • 我是否会以某种方式循环遍历,使其具有的列数是动态的?
  • 是的。组合类型是 IEnumberable,它可以转换为 List,甚至可以转换为数据行。我已将示例编辑得更清楚一些。
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2021-12-23
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多