我有 4K 檔案需要轉換為 CSV 檔案。需要提取每個欄位,然后按照找到的順序添加到 CSV 檔案中。
我有一個腳本,我希望我可以為此目的重復使用。下面的腳本將讀取第一行并檢查它,然后處理剩余的行。
我更改了腳本以僅捕獲第一行的第一個字串。這樣可行。我能夠捕捉到“ADJMT-HIS-WK”。我現在需要處理檔案的其余部分。
如您所見,檔案的其余部分由兩個數字組成,一個列名,然后是行尾的更多字符,如下所示。
05 DTE-CALL 9(6)
我只需要在每一行上捕獲列名(在這種情況下,對于這一行,它是DTE-CALL)。列名每行僅出現一次,并且始終位于兩個數字之后。獲得資料后,我必須將其輸出到一個 CSV 檔案中,該檔案包含我捕獲的所有欄位,包括第一行的表名和檔案其余部分的所有列名。每個檔案可能至少出現一個或單個表名,其中包含數百個列名。
我的輸出檔案需要看起來像這樣
ADJMT-HIST-WK,SRVCG-OFC-CDE,ST-CDE-FMHA,CTY-DST-CDE,SRVCG-CDE-OFC-CTY,.,.,.,. and so on.
如果我可以將每個欄位括在引號中,那將在以后為我節省一步。
任何人都可以為我簡化此程式嗎?
原始資料
ADJMT-HIST-WK VER 1 D SUFFIX
05 SRVCG-OFC-CDE
10 ST-CDE-FMHA 9(2)
10 CTY-DST-CDE 9
10 SRVCG-CDE-OFC-CTY 9(2)
05 DTE-CALL 9(6)
05 CR-AMT-ADJMT S9(9)V99
05 DR-AMT-ADJMT S9(9)V99
05 PROCG-STAT-INDCTR X(1)
05 DTE-DPST
10 MO-GRGRN 9(2)
10 DAY-GRGRN 9(2)
10 YR 9(2)
05 REAS-CDE-CB X(3)
05 USER-ID
10 AUTHY-CDE-TRML-OPRTR X(1)
腳本
$CBLFileList = Get-ChildItem -LiteralPath "C:\IDMS" -File -Recurse
$regex = '^\S '
ForEach ($CBLFile in $CBLFileList) {
$firstLine, $remainingLines = $CBLFile | Get-Content
if ($firstLine -cmatch $regex) {
$toRemove = $Matches[0].Trim()
Write-Host "Found Match - $toRemove " -foregroundcolor Red
# & { $firstLine -creplace $regex; $remainingLines -creplace $toRemove } |
# Set-Content -LiteralPath $CBLFile.FullName
}
}
uj5u.com熱心網友回復:
您可以使用完全相同的方法來提取列名:用于-{c,i,}match測驗字串是否具有相關資料,$Matches以進行提取。
您可以使用-f字串格式運算子來參考每個名稱。
$CBLFileList = Get-ChildItem -LiteralPath "C:\IDMS" -File -Recurse
$tableNameRegex = '^\S '
$columnNameRegex = '^\s*\d{2}\s (\S )'
foreach ($CBLFile in $CBLFileList) {
$firstLine, $remainingLines = $CBLFile | Get-Content
if ($firstLine -match $tableNameRegex) {
# extract table name, add quotes
$tableName = '"{0}"' -f $Matches[0]
# then do the same for all the columns names
$columnNames = foreach($line in $remainingLines){
if($line -match $columnNameRegex){
# again, add quotes before outputting
'"{0}"' -f $Matches[1]
}
}
# concatenate all names with comma, write to disk
@($tableName;$columnNames) -join ',' |Set-Content "$($CBLFile.BaseName).csv"
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437593.html
