我正在尝试将.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
答案 0 :(得分:3)
我看到2个错误:
-match
需要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
}