替换未保存的多个文本

时间:2018-03-12 18:01:41

标签: excel-vba powershell-v3.0 vba excel

我有一堆文件需要更换内容,例如哪里有' AA'我需要替换为' E1',' A1'与' P4'。需要在不同文件中以不同方式更改相同内容。例如,在第二个文件中,AA' AA'会成为' P1'' A1'将成为' E1'等。为了实现这一点,我有一个包含2列的Excel表格,如下所示:

TC     CodeChange
086    AA-E1; A1-P2
099    AA-P2; A1-E1; A2-E2; Z3-E3
100    AA-P2; A1-E2; A2-E3; Z3-O3

我为上面写的PowerShell脚本:

脚本1:

function func3 {
    Param($arr3, $pat)
    $arr3.GetEnumerator() | ?{$_.key -like $pat} | ForEach-Object {
        $output = $_.value
        return $output
    }
}

$src  = "C:\...xlsx"
$src1 = "C:\...\..."

$sheetName = "Sheet1"

$arr = @{};

$objExcel = New-Object -ComObject Excel.Application
$workbook = $objExcel.Workbooks.Open($src)
$sheet = $workbook.Worksheets.Item($sheetName)
$objExcel.Visible = $false

$rowMax = ($sheet.UsedRange.Rows).count

$rowTC, $colTC = 1, 1
$rowCodeChange, $colCodeChange = 1, 2

for ($i=1; $i -le $rowMax-1; $i++) {
    $TC = $sheet.Cells.Item($rowTC+$i, $colTC).Text
    $CodeChg = [String]($sheet.Cells.Item($rowCodeChange+$i, $colCodeChange).Text)

    if ($arr.ContainsKey($TC) -eq $false) {
        $arr.Add($TC, $CodeChg)
    }
}

$inputfiles = (Get-ChildItem -Path $src1 -Recurse)

foreach ($inputfile in $inputfiles) {
    $pat1 = $inputfile.Name.SubString(8, 3)
    $val  = func3 $arr $pat1

    $arry1 = $val -split ';'
    Write-Host $arry1.Length

    $j = 0
    do {
        #skipping these 3 items from getting replaced
        if (($arry1[$j].Trim() -ne "S1") -and ($arry1[$j].Trim() -ne "S2") -and ($arry1[$j].Trim() -ne "S3")) {
            (Get-Content $inputfile.FullName) | ForEach-Object {
                $_ -replace "$($arry1[$j].Split('-')[0])","$($arry1[$j].Split('-')[1])"
            } | Set-Content $inputfile.FullName
        }
        $j++
    } while ($j -le ($arry1.Length-1))
}

$objExcel.Quit()

脚本2:

function func3 {
    param($arr3, $pat)
    $arr3.GetEnumerator() | ?{$_.key -like $pat} | ForEach-Object {
        $output=$_.value
        return $output
    }
}

$src  = "C:\...xlsx"
$src1 = "C:\..."

$sheetName = "Sheet1"

$arr = @{};

$objExcel = New-Object -ComObject Excel.Application
$workbook = $objExcel.Workbooks.Open($src)
$sheet = $workbook.Worksheets.Item($sheetName)
$objExcel.Visible = $false

$rowMax = ($sheet.UsedRange.Rows).Count

$rowTC, $colTC = 1, 1
$rowCodeChange, $colCodeChange = 1, 2

for ($i=1; $i -le $rowMax-1; $i++) {
    $TC = $sheet.Cells.Item($rowTC+$i, $colTC).Text
    $CodeChg = [String]($sheet.Cells.Item($rowCodeChange+$i, $colCodeChange).Text)

    if ($arr.ContainsKey($TC) -eq $false) {
        $arr.Add($TC, $CodeChg)
    }
}

$inputfiles = (Get-ChildItem -Path $src1 -Recurse)

foreach ($inputfile in $inputfiles) {
    $pat1 = $inputfile.Name.SubString(8, 3)
    $val  = func3 $arr $pat1

    $arry1 = $val -split ';'
    Write-Host $arry1.Length

    $j = 0
    do {
        #skipping these 3 items from getting replaced
        if (($arry1[$j].Trim() -ne "S1") -and ($arry1[$j].Trim() -ne "S2") -and ($arry1[$j].Trim() -ne "S3")){

            $content = [System.IO.File]::ReadAllText($inputfile.FullName).Replace($arry1[$j].Split('-')[0], $arry1[$j].Split('-')[1])
            [System.IO.File]::WriteAllText($inputfile.FullName, $content)
            Write-Host $arry1[$j].Split('-')[0]' replaced with '$arry1[$j].Split('-')[1]' in file: '$inputfile.FullName
        }
        $j++
    } while ($j -le ($arry1.Length-1))
}

$objExcel.Quit()

文件所在的文件夹中的文件名称包含相同的数字,并且' TC'我的Excel工作表中的列。例如:

TC 086.txt
TC 099.txt
etc.

这样,在将Excel的内容导入哈希表后,我从文件名中提取数字,并在哈希表中获取相同键的相应值。例如,密钥' 086'的值。从散列表中可以得到AA-E1; A1-P2&#39 ;.然后我从哈希表值(由;分隔)中拆分要替换的项目,然后将其存储在数组中。使用循环我尝试根据从电子表格中检索的数据替换每个文件的内容。

我对这两种方法面临的问题是每个文件中只有第一项被替换。其余的项目没有被替换。例如,只有' AA'文件中的值< TC 086.txt'正在被' E1'取代。 ' A1'没有被' P2'取代。

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。我基本上不得不修剪数组的元素

$arry1

分割后(用;分隔)并在将它们作为参数传递给'Replace'函数之前。显然,除了第一个元素之外,该数组中的每个元素之前都有一个空格(这就是它们存储在源代码中的方式:excel电子表格)。因此,“替换”方法没有在文件中找到该元素,因此没有替换它。在元素解决问题之前删除空格