Я хочу сопоставить строку из текстовых файлов с файлом CSV, если найдено совпадение, добавить из 3-го столбца в CSV - PullRequest
0 голосов
/ 25 октября 2018

У меня есть 7000+ текстовых файлов, которые мне нужно проверить на наличие строки / строки (NAME = ??????) и поиск в файле csv, чтобы увидеть, есть ли совпадение.Если в файле csv есть совпадение, я хочу добавить содержимое из третьего столбца в csv в исходный соответствующий текстовый файл в виде новой строки.

Пример нескольких строк из исходного текстафайл:

DATE=23/10/2018 09:10
NAME=CAP9000323  <b><i>- String / line to find in CSV file</i></b>
USER=
SERIAL=
BIOS="Mar 20 2009 12:00AM" "LENOVO" "LENOVO - 12e"
HWPLATFORM=LENOVO 6258A92
MANUFACTURER=LENOVO
CPU=CPU0 2200 Intel(R) Pentium(R) Dual  CPU  E2200  @ 2.20GHz Model 15, Stepping 13
MEMORY=3652724
NETWORK="7_e1kexpress" "10.248.93.8

Пример файла CSV:

Column1,Column2.4,Location
NAME=0LJA4Y,10.248.68.50,LOCATION=LEVEL 06
NAME=BTCSHFQLA01,10.91.140.10,
NAME=CAO9000961,10.248.146.172,LOCATION=WIRELESS
NAME=CAP6040638,10.68.192.151,LOCATION=GRN HO-
NAME=CAP9000035,10.248.146.171,LOCATION=WIRELESS
NAME=CAP9000066,10.161.240.26,LOCATION=GDNS-
NAME=CAP9000077,,
NAME=CAP9000323,10.248.93.8,LOCATION=FIRST START-  <b><i>- Match would find this line and copy column 3 content 'LOCATION=FIRST START-' back to original text file that it matched</i></b>
NAME=CAP9000352,,
NAME=CAP9001820,10.248.147.0,LOCATION=WIRELESS

Ожидаемый результат:

DATE=23/10/2018 09:10
NAME=CAP9000323 <b><i>- String / line to find in CSV file</i></b>
USER=
SERIAL=
BIOS="Mar 20 2009 12:00AM" "LENOVO" "LENOVO - 12e"
HWPLATFORM=LENOVO 6258A92
MANUFACTURER=LENOVO
CPU=CPU0 2200 Intel(R) Pentium(R) Dual  CPU  E2200  @ 2.20GHz Model 15, Stepping 13
MEMORY=3652724
NETWORK="7_e1kexpress" "10.248.93.8
LOCATION=FIRST START-   <b><i>- The content from the CSV file, column 3 added to the original text file</i></b>

Приложение:

Извинения, я копался (в течение нескольких дней) и пробовал различные попытки кода.

Это, казалось, было самым близким к тому, что я ищу - Соответствие строк в текстовом файле на основедля значений в CSV

Моя последняя попытка:

$CSVFIL = Import-Csv -Path C:\Collector\MissingLookup.csv
$TEXTFIL = Get-Content -Path "C:\Collector\Jobs\*.txt" | Select-String -Pattern 'NAME='

$matches = @()

foreach ($line in $TEXTFIL) {
    if ($CSVFIL -contains $line.COL1) {
        $matches += $line.COL3
    }
}

if ($matches.Count -gt 0)
{
    $matches | Foreach-Object {
        Add-Content $TEXTFIL
    }
}

Результаты, которые я получаю, это либо ничего не делает, либо ничего не записывается обратно в исходный текстовый файл.

1 Ответ

0 голосов
/ 25 октября 2018

Я думаю, что это будет делать:

$CSVFIL  = Import-Csv -Path 'C:\Collector\MissingLookup.csv'

# get a list of FileInfo objects for all .txt files in the directory and test each of them for the pattern
Get-ChildItem 'C:\Collector\Jobs\*.txt' | ForEach-Object {
    $textMatch = $_ | Select-String -Pattern '(NAME=.*)'

    # if we have found a file containing the pattern.
    if ($textMatch) {
        # iterate over the items in the CSV file to see if we can match it with the found string
        foreach ($item in $CSVFIL) {
            if ($item.Column1 -eq $textMatch.Matches[0].Value) {
                # append the value from the 3rd column in the CSV called 'Location'
                Add-Content -Path $_.FullName -Value $item.Location
                break
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...