将一个数据列分成两个

时间:2013-08-27 15:38:50

标签: sql sql-server ssis

我目前正在使用看起来像这样的.txt文件。 (第一个支架前面有一个空间)

| Column 0 |
| 01/01/2013 | 123.56 |
| 02/12/2013 | 25.34 |

数据将进入SQL Server一列。我试图将分隔符设置为“bar”但它仍然不会拆分列。我假设酒吧前面有一个空间,所以它没有认出来。

我需要将此列分为两个单独的列,一个用于“Date”,另一个用于“Total”。使用SSIS,最好的方法是什么?我需要SSIS,因为一旦它被分离,我将对这些数据做一些其他的变换。

1 个答案:

答案 0 :(得分:2)

简单的方法是使用派生列转换。你可以使用

  

SUBSTRING(«character_expression»,«start»,«length»)

如果列的长度是静态的。您的约会的一个例子是:

  

SUBSTRING(INPUTColumn,3(列开始的字符数),10(列的大小))

如果列的大小不同,那么我将使用 scrip任务来拆分字符串并自行格式化信息。如果需要,我可以提供一些示例代码。

编辑:我再次看了你的样本,此时我假设你的cloumn大小是动态的。如果是这样,最好的方法是使用脚本任务。然后,如果添加“|”,则可以使用.split()将行拆分为数组。和“”以及拆分的参数将从原始字符串中删除。然后,您可以格式化数据并将其输出到数据库。

第一步是在ssis中创建一个字符串参数。它的值应该是您的文件路径。然后将脚本任务添加到您的数据流。在自定义属性下的编辑器中,将该参数添加到 readOnlyVariables

然后打开这样的文件:

    byte[] empty = new byte[] { };
    //Outside parameter for the ssisparameter file path
    //Check for the parameter existance
    IDTSVariable100 filePathVariable;
    try
    {
        filePathVariable = this.ReadOnlyVariables["ParameterName"];
    }
    catch (Exception )
    {

    }
    string filePath = filePathVariable.Value.ToString();

这会将您的文件拆分为一系列行。

 private String[] fileLines;
 using (StreamReader reader = new StreamReader(filePath))
        {
            //Read file and split into lines
            string fileStream = reader.ReadToEnd();
            fileLines = fileStream.Split('\n');
        }

使用您想要使用的所有分隔符创建这样的数组。

 private char[] delimiters = { ' ', ':', '\n', '\\', '=' };

然后使用类似的东西遍历你的行:

string[] Tokens = fileLines[index].Split(delimiters);

以上所有内容都应包含在脚本任务的preExecute部分中。这里的想法是将您的所有信息分成单独的列表,这些列表将代表列(所以日期列表和值列表)。

脚本任务编辑器中,您可以将列添加为输出。 然后将其添加到脚本的输出部分:

 for (int i = 0; i < lineCount; i++)
    {
        outputBuffer.AddRow();
        outputBuffer.date = dateList[i];
        outputBuffer.value = valueList[i];
     }