根据标题行将文本文件拆分为多个文件

时间:2017-05-03 09:32:01

标签: c# powershell ssis

我正在尝试将.txt文件从SSIS脚本任务拆分为单独的数据文件,使用从FILE|开始的标题行来表示何时应创建新文件。从FILE|开始的行是管道分隔的,第二个分隔的值是要使用的文件名。

在下面的代码中,我已经能够获得文件名。但是,我希望能够将FILE|标题行之间的所有行写入其对应的文件。例如,DataFile1将标题行下方的所有文件都写入DataFile1.txt,直至行标题DataFile2被点击。

以下是我的评论代码,说明我已经走了多远以及我认为我失踪了什么。任何有助于让我超越线路的帮助表示赞赏:

    public void Main()
    {
        // The file from my SSIS package containing the unsplit data
        string dataFile = Dts.Variables["User::unsplitDataFile"].Value.ToString();

        // The destination I want to write this to, e.g. \\vSplitDestination\DataFile1.txt:
        string splitDestination = Dts.Variables["User::vSplitDestination"].Value.ToString();

        bool fireAgain = true;

        int counter = 0;
        string line;

        // Read the file and display it line by line.
        System.IO.StreamReader file = new System.IO.StreamReader(dataFile);
        while ((line = file.ReadLine()) != null)
        {
            if (line.StartsWith("FILE"))
            {
                // File Names found
                Dts.Events.FireInformation(0, "Info:", line.Split('|','|')[1].ToString(), String.Empty, 0, ref fireAgain);

                // Create file with file name above ( line.Split('|','|')[1].ToString() ) and fill with all rows until next "FILE" pattern hit.

                // Repeat for all file names

            }

            counter++;
        }

        file.Close();

        Dts.TaskResult = (int)ScriptResults.Success;
    }

对于用户"观察者"在下面的评论中,尝试使用powershell脚本 - 对此的答案也欢迎:

$Path = "\\Transfer"
$InputFile = (Join-Path $Path "unsplit.data")
$Reader = New-Object System.IO.StreamReader($InputFile)

While (($Line = $Reader.ReadLine()) -ne $null) {
    If ($Line -match "FILE|(.+?)") {
        $OutputFile = $matches[0] + ".txt"
    }

    Add-Content (Join-Path $Path $OutputFile) $Line
}

示例数据(因此每个FILE|成为其自己的数据文件(n).txt文件,其中包含该文件中的以下行)

FILE|datafile1|25/04/17
25044|0001|37339|10380|TT75
25045|0001|37339|10398|TT75
25046|0001|78711|15940|TT75
FILE|datafile2|25/04/17
25047|0001|98745|11263|TT75
25048|0001|96960|13011|TT84
FILE|datafile3|25/04/17
25074|0001|57585|13639|TT84
25075|0001|59036|10495|TT84
FILE|datafile4|25/04/17
25076|0001|75844|13956|TT84
25077|0001|17430|01111|TT84

1 个答案:

答案 0 :(得分:3)

我看到2个错误:

  • -match需要RegEx,在RegEx中,未转义的竖线表示一个或表达式,因此您必须使用反斜杠|
  • 转义\|
  • RegEx中第一个匹配的组为$matches[1]
  • 匹配前两个栏之间的所有内容我使用了否定的类
$Path = "\\Transfer"
$InputFile = (Join-Path $Path "unsplit.data")
$Reader = New-Object System.IO.StreamReader($InputFile)

While (($Line = $Reader.ReadLine()) -ne $null) {
    If ($Line -match 'FILE\|([^\|]+)') {
        $OutputFile = "$($matches[1]).txt"
    }
    Add-Content (Join-Path $Path $OutputFile) $Line
}