PowerShell - 通过逗号分隔的文本文件解析并将值插入SQL表

时间:2016-07-13 15:52:51

标签: sql powershell parsing

我有一个文本文件,其中包含文件名,文件大小以及之前(.txt)和之后(.txt.Z)压缩的创建日期。数据用逗号分隔,如下所示:

注意:下面的文件名不是实际的文件名。我将每周收到这种类型的文件,因此每周文件都会有不同的名称。

File1.txt,1449124525,Jul 09 01:13
File2.txt,2601249364,Jul 09 01:30
File3.txt,18105630,Jul 09 01:01
File4.txt,732235442,Jul 09 01:17
File1.txt.Z,130652147,Jul 09 01:13
File2.txt.Z,217984273,Jul 09 01:30
File3.txt.Z,2320129,Jul 09 01:01
File4.txt.Z,61196011,Jul 09 01:17

等...

目前,我将第一行的代码插入SQL中44次(共有22个文件名,因此压缩前后共有44行)。

$file = Get-Content "MY_FILE.txt"

$line = $null

foreach ($line in $file)
{
    #Split fields into values
    $line = $file -split (",")
    $FileName = $line[0]
    $FileSize = $line[1]
    $FileDate = $line[2]

    #Format Date Field
    $DateString = $FileDate
    $DateFormat = "MMM dd HH:mm"
    $Culture = $(New-Object System.Globalization.CultureInfo -ArgumentList "en-US")
    $DateString = $DateString -replace "\s+"," "
    $NewDate = [Datetime]::ParseExact($DateString, $DateFormat, $Culture)
    $FileDate = Get-Date $NewDate -Format "yyyy-MM-dd HH:mm:ss"

    #SQL Connection Info
    $Connection = New-Object System.Data.SQLClient.SQLConnection
    $Connection.ConnectionString = "server='MY_SERVER';database='MY_DATABASE';trusted_connection=true;"
    $Connection.Open()
    $Command = New-Object System.Data.SQLClient.SQLCommand
    $Command.Connection = $Connection

    #Insert into SQL
    $sql = "INSERT INTO [MY_DATABASE].[dbo].[MY_TABLE] ([FileName],[FileSize],[FileDate]) VALUES ('" + $FileName + "'," + $FileSize + ",'" + $FileDate + "')"

    $Command.CommandText = $sql 
    $Command.ExecuteReader()
}

$Connection.Close()

我希望能够做的另一个棘手的事情是将每个文件及其相应的大小和日期加载到压缩之前和之后的同一行。我似乎无法掌握如何能够做到这一点。不过,上述部分更为重要。无论如何,我希望它在SQL中看起来像这样:

| InFileName | InFileSize | InFileDate   | OutFileName | OutFileSize | OutFileDate  |
-------------------------------------------------------------------------------------
| File1.txt  | 1449124525 | Jul 09 01:13 | File1.txt.Z | 130652147   | Jul 09 01:13 |
| File2.txt  | 2601249364 | Jul 09 01:30 | File2.txt.Z | 217984273   | Jul 09 01:30 |
| File3.txt  | 18105630   | Jul 09 01:01 | File3.txt.Z | 2320129     | Jul 09 01:01 |
| File4.txt  | 732235442  | Jul 09 01:17 | File4.txt.Z | 61196011    | Jul 09 01:17 |

谢谢!

2 个答案:

答案 0 :(得分:2)

我建议您先导入数据,然后再导入SQL Server。如果您使用逗号分隔值,请使用Import-CSV。

除此之外,您还可以在导入时指定列名,因此我为压缩文件添加了空列。

然后遍历行,并合并压缩文件 - 请注意,他们的名字来自" InFileName"列,并移动到" OutFileName"柱。它不是特别有效;对于没有.z结尾的每个文件,它遍历所有行以查找相应的.z文件。

$fileHeaders = 'InFileName','InFileSize','InFileDate','OutFileName','OutFileSize','OutFileDate'
$inData = Import-Csv D:\f.txt -Header $fileHeaders

$outData = foreach ($row in $inData) {
    if ($row.InFileName -notmatch '\.z$') {
        $outFile = $inData | Where {$_.InFileName -match "$($row.InFileName).."}
        $row.OutFileName = $outFile.InFileName
        $row.OutFileSize = $outFile.InFileSize
        $row.OutFileDate = $outFile.InFileDate
        $row
    }
}

e.g。之后:

$outData | ft -AutoSize

InFileName InFileSize InFileDate   OutFileName OutFileSize OutFileDate 
---------- ---------- ----------   ----------- ----------- ----------- 
File1.txt  1449124525 Jul 09 01:13 File1.txt.Z 130652147   Jul 09 01:13
File2.txt  2601249364 Jul 09 01:30 File2.txt.Z 217984273   Jul 09 01:30
File3.txt  18105630   Jul 09 01:01 File3.txt.Z 2320129     Jul 09 01:01
File4.txt  732235442  Jul 09 01:17 File4.txt.Z 61196011    Jul 09 01:17

然后遍历$ outData,你必须更改SQL插入等等来处理6个字段。您还需要所有日期解析/字段处理代码,我完全省略了。

答案 1 :(得分:1)

看起来在foreach循环的第一行中,您在整个$ file数组上调用split而不是在您使用的$行上调用split。如果您为$line = $file -split (",")交换$line = $line -split (","),它应该有用。虽然您可能希望为参数或要为其分配的变量使用不同的名称。