Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 读取列数不均匀的平面文件_Sql_Ssis_Etl - Fatal编程技术网

Sql 读取列数不均匀的平面文件

Sql 读取列数不均匀的平面文件,sql,ssis,etl,Sql,Ssis,Etl,我有一个像这样的csv文件 **0, xyz, 20130301121212 1, 6997, 01234 2, 012345, 5678999, Y, 11, 20130301 2, 012345, 5678988, Y, 11, 20130301 1, 6647, 01234 2, 012345, 5678999, Y, 11, 20130301 2, 012345, 5678988, Y, 11, 20130301 9, 8** 带有0的行是标题,1代表不同的商店,2代表产品的详细信息记

我有一个像这样的csv文件

**0, xyz, 20130301121212
1, 6997, 01234
2, 012345, 5678999, Y, 11, 20130301
2, 012345, 5678988, Y, 11, 20130301
1, 6647, 01234
2, 012345, 5678999, Y, 11, 20130301
2, 012345, 5678988, Y, 11, 20130301
9, 8**
带有0的行是标题,1代表不同的商店,2代表产品的详细信息记录

第一列为2的行是第一列为第1行的商店的详细信息


有人能告诉我如何将这些行按2和相应的1分组吗?

我没有使用SQL Server,我只能提供一般指导:

1将文件加载到数据库中,整行在列中,添加行的行号。结果将类似于rid是行号:

rid rline
1   1, 6997, 01234
2   2, 012345, 5678999, Y, 11, 20130301
3   2, 012345, 5678988, Y, 11, 20130301
4   1, 6647, 01234
5   2, 012345, 5678999, Y, 11, 20130301
6   2, 012345, 5678988, Y, 11, 20130301
2使用一些SQL获取所需形状的数据。这意味着您必须为每一行2查找前一行1。未测试:

select 
    csvdata.rline,
    csvdata.rid,
    (select rline from csvdata x where rline like '1,%' and x.rid < csvdata.rid order by x.rid desc limit 1) as TopRline
from 
    csvdata
where
    rline like '2,%' -- this will limit lines to only those with the detail
3使用一些SQL函数将数据拆分为列,例如在PostgreSQL中,文本数组可以做到这一点。假设2的结果存储在表temp中,则类似于:

select
  (string_to_array(rline,','))[1] as column1,
  (string_to_array(rline,','))[2] as column2,
  (string_to_array(rline,','))[3] as column3,
  (string_to_array(rline,','))[4] as column4,
  (string_to_array(rline,','))[5] as column5,
  (string_to_array(rline,','))[6] as column6,
  (string_to_array(TopRline,','))[1] as column1top,
  (string_to_array(TopRline,','))[2] as column2top,
  (string_to_array(TopRline,','))[3] as column3top,
from
  temp

4将数据存储在您想要的任何表中。

注意到SSIS在处理锯齿状CSV时的困难,我将在SSIS运行的CMD中做一些准备工作,以便您可以使用标准CSV功能。加载到两个单独的表,然后只连接共享键列上的表

首先将锯齿状文件中的行拆分为非锯齿状文件。在windows中,下面这样的操作应该可以实现

findstr/b 1,InputFile.txt>InputFileRow_1.txt findstr/b2,InputFile.txt>InputFileRow_2.txt

然后使用SSIS标准CSV功能将InputFileRow_1.txt和InputFileRow_2.txt加载到表InputFileRow_1和InputFileRow_2表中

最后,下面的内容将用于分组

 SELECT *
 FROM InputFileRow_1 ifr1
 INNER JOIN InputFileRow_2 ifr2
 ON ifr1.RowType2_ID = ifr2.RowType2_ID

*根据文件中行类型的分布和文件的大小,从IO的角度来看,此方法可能是浪费的。

如果不理解最后一条语句,请将这两条语句分组为2和相应的1。但我可以告诉您,首先编写一个ETL将数据加载到表中,最好将数据加载到2个表中。欢迎使用StackOverflow!您是否尝试过任何可以与他人分享的方法,以便更容易理解您的问题?关于StackOverflow的最好的问题包括一个明确的问题、到目前为止您尝试过的内容的摘要、您尝试过的结果以及您期望的结果。所有这些都会让你的问题更清楚、更容易回答。@ljh我的意思是如何将2作为第一列的行与1作为第一列的行分组。如果您观察上面的文件,发现列数不均匀,如何将其保存到数据表中。请提供帮助。将文件加载到SQL Server非常简单,即使导入向导也可以做到这一点。问题是,你怎么知道2只和1有关系,而不是3,不是4。一旦你有了这种关系,你可以有很多不同的方法来获得你想要的结果。
 SELECT *
 FROM InputFileRow_1 ifr1
 INNER JOIN InputFileRow_2 ifr2
 ON ifr1.RowType2_ID = ifr2.RowType2_ID