Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Перенос данных из двух txt в 1 по контрольному значению (http://forum.oszone.net/showthread.php?t=349130)

Technik_spat 02-07-2021 11:42 2961284

Перенос данных из двух txt в 1 по контрольному значению
 
Здравствуйте!
Помогите, пожалуйста, с советом.
У меня по работе скриптов, формируется два файла txt, в которых огромный массив данных.
Из этого массива, надо извлечь все данные с контрольным значением 11, 99, 14 (это значения, что марки ликвидные), скрепить их с данными из другого файла с ценой и вывести в отдельный txt файл в виде столбца SGТIN; цена
Т.е. примерно вот так: 048101330038010000008019952;;11; отсюда берем 048101330038010000008019952 по нему ищем в другом файле значение, эта строка будет выглядеть так: 048101330038010000008019952;KЪЙ5ТШOГNАUГНRЧПГ6Ц140; 55.00000000 а в итоге получить вот так: 048101330038010000008019952;55.00000000
Образцы файлов:
Это где sgtin по контрольным значениямФайл 164836
А это где тот же sgtin но с ценой Файл 164837

Iska 02-07-2021 12:23 2961286

Цитата:

Цитата Technik_spat
огромный массив данных. »

Огромный — это сколько?

Technik_spat 02-07-2021 12:29 2961287

До 400 000 строк

Iska 03-07-2021 03:34 2961332

Technik_spat, поместите amark_sgtin.txt и REPACK.txt в один каталог. Поместите следующий код:
Скрытый текст
Код:

Option Explicit

Const adLockOptimistic = 3
Const adOpenStatic    = 3
Const adCmdText        = 1


Dim objFSO
Dim objRecordSet
Dim strPath2Script


Set objFSO      = WScript.CreateObject("Scripting.FileSystemObject")
Set objRecordSet = WScript.CreateObject("ADODB.Recordset")

strPath2Script = objFSO.GetParentFolderName(WScript.ScriptFullName)

With objFSO.CreateTextFile(objFSO.BuildPath(strPath2Script, "Schema.ini"), True)
        .WriteLine Join( _
                Array( _
                        "[amark_sgtin.txt]", _
                        "ColNameHeader=True", _
                        "Format=Delimited(;)", _
                        "TextDelimiter=none", _
                        "CharacterSet=ANSI", _
                        "", _
                        "[REPACK.txt]", _
                        "ColNameHeader=False", _
                        "Format=Delimited(;)", _
                        "TextDelimiter=none", _
                        "CharacterSet=ANSI", _
                        "Col1=SGTIN Text", _
                        "Col2=Any Text", _
                        "Col3=Price Text", _
                        "", _
                        "[ResultFile.txt]", _
                        "ColNameHeader=True", _
                        "Format=Delimited(;)", _
                        "TextDelimiter=none" _
                ), vbCrLf _
        )
       
        .Close
End With

If objFSO.FileExists(objFSO.BuildPath(strPath2Script, "ResultFile.txt")) Then
        objFSO.DeleteFile objFSO.BuildPath(strPath2Script, "ResultFile.txt")
End If

objRecordSet.Open "SELECT L.[SGTIN], R.[Price] " & _
        "INTO [ResultFile.txt] " & _
        "FROM [amark_sgtin.txt] AS L LEFT JOIN " & _
        "[REPACK.txt] AS R ON " & _
        "L.[SGTIN] = R.[SGTIN] " & _
        "WHERE L.[STATUS] IN (11, 99, 14)", _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath2Script & ";Extended Properties=""text;""", _
        adOpenStatic, adLockOptimistic, adCmdText

Set objRecordSet = Nothing
Set objFSO      = Nothing

WScript.Quit 0


в файл с расширением .vbs в тот же каталог. Запустите скрипт из сохранённого файла на исполнение (если у Вас x64 ОС — используйте x86-версию хоста wscript.exe/cscript.exe из каталога C:\Windows\SysWOW64). Если скрипт отработает корректно, Вы получите в том же каталоге результирующий csv-файл ResultFile.txt с искомым содержимым.

Например:


Technik_spat 03-07-2021 08:03 2961335

Цитата:

Цитата Iska
C:\Windows\SysWOW64 »

ОГРОМНОЕ СПАСИБО)))) ОТРАБОТАЛО ОТЛИЧНО!!!!

Iska 03-07-2021 13:33 2961348

Technik_spat, сколько по времени у Вас вышло?

Technik_spat 03-07-2021 15:53 2961352

Конкретно по Вашему скрипту отработало до 17 000 строк (остальные тупо отвалились на этапе отбора по фильтру), в районе 1-3 минут.

Iska 03-07-2021 19:04 2961359

Цитата:

Цитата Technik_spat
отработало до 17 000 строк (остальные тупо отвалились на этапе отбора по фильтру) »

Не — это значит, что отработало все:
Цитата:

Цитата Technik_spat
До 400 000 строк »

Цитата:

Цитата Technik_spat
в районе 1-3 минут. »

Спасибо, ясно.

DJ Mogarych 04-07-2021 14:27 2961395

А в Powershell сколько будет выполняться? (Подразумевается версия 5.1)
Код:


Measure-command -Expression {

$sgtin = (Import-Csv "C:\temp\amark_sgtin.txt" -Delimiter ';' -Encoding default |? status -match "^11$|^14$|^99$").sgtin
$prices = Import-Csv "C:\temp\REPACK.txt" -Delimiter ';' -Encoding default -Header sgtin,0,price |select sgtin,price

$result = @()
$prices |% {
    if ($_.sgtin -in $sgtin) {$result += $_}
}

$result |Export-Csv "C:\temp\result.csv" -Delimiter ';' -Encoding default -NoTypeInformation

}

pause


Technik_spat 05-07-2021 09:49 2961439

Цитата:

Цитата DJ Mogarych
А в Powershell сколько будет выполняться? (Подразумевается версия 5.1) »

Поуэершелл не проходит.
Цитата:

Необходимо предоставить выражение для значения справа от оператора "-".
At line:8 char:18

Неожиданный токен "in" в выражении или инструкции.
At line:8 char:19

Неожиданный токен "sgtin" в выражении или инструкции.
At line:8 char:22
Цитата:

Цитата Iska
Не — это значит, что отработало все: »

Всё правильно отработало. Марки то выбывают ежедневно. Из огромного массива данных, в обороте не более 2500-3000 марок, в режиме ожидания выбытия как раз 15 000- 20 000 шутк, а остальные имеют признак архива, т.е. они вообще не нужны.

DJ Mogarych 05-07-2021 10:00 2961440

Версия Powershell какая?
Код:

host

Technik_spat 05-07-2021 11:20 2961449

Цитата:

Цитата DJ Mogarych
Версия Powershell какая? »

Name : Windows PowerShell ISE Host
Version : 2.0

5 не могу поставить, винда не пускает (хотя официальная)

Iska 05-07-2021 16:30 2961479

Technik_spat, какая ОС?

Technik_spat 06-07-2021 08:35 2961505

Цитата:

Цитата Iska
Technik_spat, какая ОС? »

Win 7 Pro x64 SP1

Iska 06-07-2021 09:23 2961508

Technik_spat, 5.1 должна ставиться.

DJ Mogarych 06-07-2021 09:42 2961509

https://docs.microsoft.com/ru-ru/pow...wmf-51-package

Я там наверху подправил скрипт, забыл фильтр на 11, 14 и 99 поставить.

Technik_spat 06-07-2021 10:36 2961512

Цитата:

Цитата Iska
Technik_spat, 5.1 должна ставиться. »

Вся проблема в том, что в 2018 году, когда компания Майкрософт упорно била на перевод на win10 (я не знаю как у остальных, а у меня 7 машин было на win 7 pro и они упорно раз в два-три месяца включали автоматический переход win 10), мы блокировали всё что связано с обновлениями. Т.е. грубо говоря доблокировались(((((

DJ Mogarych 06-07-2021 12:08 2961519

По ссылке, которую я дал, нужно поставить .NET Framework 4.5.2 как предварительное требование, и потом ставить уже сам WMF 5.1.

Technik_spat 07-07-2021 09:21 2961604

Цитата:

Цитата DJ Mogarych
Я там наверху подправил скрипт, забыл фильтр на 11, 14 и 99 поставить. »

Ругается:
WARNING: One or more headers were not specified. Default names starting with "H" have been used in place of any missing headers.

По поуэрШеллу:
Пришлось идти длинным путем: сперва wufuck, потом удаление kb4012218 и WMF 5.0 (был установлен, но видно как то криво, раз PS старенький стоял), потом восстановление 4.5.0, 4.8.2 и только потом установка 5.2

alpap 07-07-2021 16:34 2961628

Цитата:

Цитата Technik_spat
Ругается »

это из-за двойного ;; при переводе в csv (не понимает где же еще один столбец), в принципе не страшно, должно работать.

или так:
Код:

$sgtin  = 'C:\temp\amark_sgtin.txt'
$repack = 'C:\temp\REPACK.txt'
$out    = 'C:\temp\out.txt'

Switch -Regex -File ($sgtin) {
  '^(.+);{2}11;$|^(.+);{2}14;$|^(.+);{2}99;$' {
    foreach ($i in $Matches[1]) {
      Switch -Regex -File ($repack) {
        "($i);.+;\s+(.+)$" {"$($Matches[1]);$($Matches[2])"|Out-File $out -app}
      }
    }
  }
}


Technik_spat 08-07-2021 07:55 2961680

Цитата:

[q=alpap]или так:
Код:

$sgtin = 'C:\temp\amark_sgtin.txt'
$repack = 'C:\temp\REPACK.txt'
$out = 'C:\temp\out.txt'
Switch -Regex -File ($sgtin) {
 '^(.+);{2}11;$|^(.+);{2}14;$|^(.+);{2}99;$' {
 foreach ($i in $Matches[1]) {
 Switch -Regex -File ($repack) {
 "($i);.+;\s+(.+)$" {"$($Matches[1]);$($Matches[2])"|Out-File $out -app}
 }
 }
 }
}

Нет, он нереально долгий((((( Только ожидание создания файла заняло более 5 минут(((((
Общее время работы скрипта, составило 50 минут((((
Но только обратил внимание, скрипт на power shell не пропускает строки. На vbs часть строк не имеет второго параметра(((

alpap 08-07-2021 13:01 2961709

попробуйте еще так:
Код:

$sgtin  = 'C:\temp\amark_sgtin.txt'
$repack = 'C:\temp\REPACK.txt'
$out    = 'C:\temp\out.txt'

$csvSgtin  = Import-Csv -Path $sgtin -delim ';' -Header SGТIN, H, Value
$csvRepack = Import-Csv -Path $repack -delim ';' -Header Name, H, Value

$a = ($csvSgtin|? Value -Match '^11$|^14$|^99$').SGТIN

$ar = [System.Collections.Generic.List[PSCustomObject]]::New()
foreach ($ib in $csvRepack.GetEnumerator()) {
  foreach ($ia in $a) {
    if ($ib.Name -eq $ia) {$r = $ib.Name+';'+$ib.Value; $ar.Add($r)}
  }
}
$ar|Out-File $out

часть взял из кода DJ Mogarych, но его код у меня что-то не заработал

Technik_spat 08-07-2021 14:25 2961713

Цитата:

Цитата alpap
попробуйте еще так: »

На pwsh7 предыдущий код пошустрее работает (вместо 50 минут, около 10 заняло), а этот вообще завис((((

alpap 08-07-2021 16:12 2961723

исправил практически как у DJ Mogarych, не пойму почему у меня он не заработал, вроде все так же.
Код:

$sgtin  = 'C:\temp\amark_sgtin.txt'
$repack = 'C:\temp\REPACK.txt'
$out    = 'C:\temp\out.txt'

$csvSgtin  = Import-Csv -Path $sgtin -delim ';' -Header SGТIN, H, Value
$csvRepack = Import-Csv -Path $repack -delim ';' -Header SGТIN, H, Value

$a = ($csvSgtin|? Value -Match '^11$|^14$|^99$').SGТIN

$r = foreach ($i in $csvRepack) {
  if ($a -eq $i.SGТIN) {$i.SGТIN+';'+$i.Value}
}
$r|Out-File $out


Technik_spat 09-07-2021 08:53 2961778

Цитата:

Цитата alpap
исправил практически как у DJ Mogarych, не пойму почему у меня он не заработал, вроде все так же. »

СПАСИБО)))))
Насчёт кода:
У Вас почему то в коде затесались не unikode буквы.
Попробуйте Ваш же скрипт, но скопировав отсюда:

Код:

$sgtin  = 'C:\temp\amark_sgtin.txt'
$repack = 'C:\temp\REPACK.txt'
$out    = 'C:\temp\out.txt'

$csvSgtin  = Import-Csv -Path $sgtin -delim ';' -Header SGTIN, H, Value
$csvRepack = Import-Csv -Path $repack -delim ';' -Header SGTIN, H, Value

$a = ($csvSgtin|? Value -Match '^11$|^14$|^99$').SGTIN

$r = foreach ($i in $csvRepack) {
  if ($a -eq $i.SGTIN) {$i.SGTIN+';'+$i.Value}
}
$r|Out-File $out

Кстати, теперь быстро обработалось. В течении минут 5 обработалось, правда я так понял, он сперва где то во временной папке данные формирует, а потом записывает в текстовый файл.


Время: 23:42.

Время: 23:42.
© OSzone.net 2001-