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

PowerShell-通过逗号分隔的文本文件进行解析,并将值插入SQL表,sql,powershell,parsing,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 File

我有一个文本文件,其中包含文件名、文件大小以及(.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个)

我希望能够做的另一件棘手的事情是在压缩前后将每个文件及其相应的大小和日期加载到同一行。我似乎无法理解我如何才能做到这一点。不过,上述部分更为重要。无论如何,我希望它在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 |

谢谢

在foreach循环的第一行中,似乎是在整个$file数组上调用split,而不是在正在使用的$line上。如果您将
$line=$file-split(“,”)
交换为
$line=$line-split(“,”)
,它应该可以工作。尽管您可能希望为参数或分配给它的变量使用不同的名称。

在foreach循环的第一行中,您似乎在整个$file数组上调用split,而不是在正在使用的$line上。如果您将
$line=$file-split(“,”)
交换为
$line=$line-split(“,”)
,它应该可以工作。尽管您可能希望为参数或分配给它的变量使用不同的名称。

我建议您先处理数据,然后再导入SQL server。如果使用逗号分隔的值,请使用导入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个字段。您还需要所有的日期解析/字段处理代码,我完全忽略了这些代码。

我建议您先处理数据,然后再导入SQL server。如果使用逗号分隔的值,请使用导入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个字段。您还需要所有的日期解析/字段处理代码,我完全忽略了这些代码。

谢谢,这很有效。唯一的问题是,它似乎并没有按照文件的顺序加载它们。你知道有解决办法吗?谢谢,这很有效。唯一的问题是,它似乎并没有按照文件的顺序加载它们。你知道这个问题的解决方法吗?首先,谢谢你的回复。这让我头痛了一个月。在
FOREACH
循环结束之前,我在
IF
语句之后插入了SQL insert语句。不过,它最终插入了44行。前22行正是我所需要的,但最后22行使用相应的文件大小和文件日期再次重复每个InFileName,最后一个OutFileName文件对每行重复。由于必须取出并丢弃一半的输入行,因此必须注意SQL插入的位置。要么在
if
中执行,在结尾处,
$row
是未压缩的文件+填充的额外数据,要么在第一个循环之后完全编写
foreach($outData中的row){}
循环,在那里可能会更清晰。通过在结尾处的
if
中添加它,Aweasome成功了。非常感谢。首先,谢谢你的回复。这让我头痛了一个月。在
FOREACH
循环结束之前,我在
IF
语句之后插入了SQL insert语句。不过,它最终插入了44行。前22行正是我所需要的,但最后22行使用相应的文件大小和文件日期再次重复每个InFileName,最后一个OutFileName文件对每行重复。由于必须取出并丢弃一半的输入行,因此必须注意SQL插入的位置。要么在
if
中执行,在结尾处,
$row
是未压缩的文件+填充的额外数据,要么在第一个循环之后完全编写
foreach($outData中的row){}
循环,在那里可能会更清晰。通过在结尾处的
if
中添加它,Aweasome成功了。非常感谢。