C# 在CSV文件中将数据从一行解析为多行
我是SSIS新手,需要一些帮助了解如何解析这些数据。课程级学习目标需要拆分为多行,[]中的数据需要移动到自己的列中。任何帮助都将不胜感激。CSV文件包含多条记录。下面的示例只是一条记录 CSV文件的当前格式:C# 在CSV文件中将数据从一行解析为多行,c#,csv,ssis,rows,C#,Csv,Ssis,Rows,我是SSIS新手,需要一些帮助了解如何解析这些数据。课程级学习目标需要拆分为多行,[]中的数据需要移动到自己的列中。任何帮助都将不胜感激。CSV文件包含多条记录。下面的示例只是一条记录 CSV文件的当前格式: Prefix/Code,Name,Credits,Description,Course-level Learning Objectives ABE 095,Keys to Academic Success,3.0 ,"Basic .. assessment. "," Identi
Prefix/Code,Name,Credits,Description,Course-level Learning Objectives
ABE 095,Keys to Academic Success,3.0 ,"Basic .. assessment. ","
Identify learn. [EXPLORE]
Evaluate personal, goals. [ACT]
Utilize development. [EXPLORE]
"
文件需要采用的格式
Prefix/Code,Name,Credits,Description,Course-level Learning Objectives,Type
ABE 095,Keys to Academic Success,3.0 ,"Basic .. assessment.","Identify learn.", [EXPLORE]
ABE 095,Keys to Academic Success,3.0 ,"Basic .. assessment.","Evaluate goals.", [ACT]
ABE 095,Keys to Academic Success,3.0 ,"Basic .. assessment.","Utilize dev.", [EXPLORE]
在SSIS 2008中没有直接使用文件的方法,但可以在SSIS 2012中完成,然后透视数据。如果要在SSIS 2008中执行此操作,应使用脚本任务格式化文件,然后在DF中使用平面文件源,在脚本任务中,应使用文件读取器完成此操作,有关拆分此文件的详细信息,请参阅此链接基本步骤:
CREATE FUNCTION [dbo].[udf_NthIndex]
(@Input VARCHAR(8000),
@Delimiter CHAR(1),
@Ordinal INT)
RETURNS INT
AS
BEGIN
DECLARE @Pointer INT,
@Last INT,
@Count INT
SET @Pointer = 1
SET @Last = 0
SET @Count = 1
WHILE (2 > 1)
BEGIN
SET @Pointer = CHARINDEX(@Delimiter,@Input,@Pointer)
IF @Pointer = 0
BREAK
IF @Count = @Ordinal
BEGIN
SET @Last = @Pointer
BREAK
END
SET @Count = @Count + 1
SET @Pointer = @Pointer + 1
END
RETURN @Last
END
GO
;
该方法使用“n”索引函数和
如果您能够使用正则表达式,则可以节省一些代码。在SQL Server 2008中使用正则表达式需要CLR。在向您展示如何一步一步地完成这项工作方面做得很好。该解决方案对于每个课程中少量的“类型”值足够有效 谢谢你格式化我的帖子。我已经做了几个小时的研究来找出如何做到这一点,这让我发疯。比林克:我注意到我遇到的许多帖子都得到了你的回复。你能帮我一个解决方案吗?你能在数据库表中至少暂时存储数据吗?例如SQL Server?是的,SQL Server可用于将数据插入表中。您是否有权在SQL Server数据库中创建用户定义的标量值函数?另外,它是什么版本的SQL Server?2008?我下面的回答假设您可以创建一个用户定义的标量值函数,并且您正在使用SQL Server 2008。祝你好运。SSIS 2012是否提供了更多数据解析工具?我熟悉vb和java,所以我理解c#,但butt的问题是2008不提供脚本调试,这使得我很难找到错误所在。如果是脚本组件,您无法在ssis 2008中调试,但可以在脚本任务中调试,为此,您必须将解决方案的属性设置为32位,或者,您也可以始终添加MsgBox(column.ToString())以在执行期间查看结果
WITH s1
AS ( SELECT 'ABE 095' AS [Prefix/Code]
, 'Keys to Academic Success' AS Name
, '3.0' AS Credits
, 'Basic .. assessment. ' AS Description
, '
Identify learn. [EXPLORE]
Evaluate personal, goals. [ACT]
Utilize development. [EXPLORE]
' AS [Course-level Learning Objectives]
) , s2
AS ( SELECT [Prefix/Code]
, Name
, Credits
, Description
, dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 2
) + 2 AS Type1Start
, dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 3
) - dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 2
) + 0 AS Type1Length
, dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 3
) + 2 AS Type2Start
, dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 4
) - dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 3
) + 0 AS Type2Length
, dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 4
) + 2 AS Type3Start
, dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 5
) - dbo.udf_NthIndex( [Course-level Learning Objectives] , CHAR( 13
) , 4
) + 0 AS Type3Length
FROM s1
) , s3
AS ( SELECT s2.[Prefix/Code]
, s2.Name
, s2.Credits
, s2.Description
, RTRIM( LTRIM( SUBSTRING( s1.[Course-level Learning Objectives] , s2.Type1Start , Type1Length
)
)
)AS Type1_chunk
, RTRIM( LTRIM( SUBSTRING( s1.[Course-level Learning Objectives] , s2.Type2Start , Type2Length
)
)
)AS Type2_chunk
, RTRIM( LTRIM( SUBSTRING( s1.[Course-level Learning Objectives] , s2.Type3Start , Type3Length
)
)
)AS Type3_chunk
FROM s1 , s2
) , unpivot1
AS ( SELECT [Prefix/Code]
, Name
, Credits
, Description
, Type_chunk
FROM(
SELECT [Prefix/Code]
, Name
, Credits
, Description
, Type1_chunk
, Type2_chunk
, Type3_chunk
FROM s3
)p UNPIVOT( Type_chunk FOR Type_descrip IN( Type1_chunk
, Type2_chunk
, Type3_chunk
)
)AS unpvt
)
SELECT [Prefix/Code]
, Name
, Credits
, Description
--, Type_chunk
, LEFT( u.Type_chunk , -2 + dbo.udf_NthIndex( u.Type_chunk , '[' , 1
)
)AS [Learning Objectives]
, RIGHT( u.Type_chunk , 1 + LEN( u.Type_chunk
) - dbo.udf_NthIndex( u.Type_chunk , '[' , 1
)
)AS Type
FROM unpivot1 u;