Войти

Показать полную графическую версию : Перенос данных из двух txt в 1 по контрольному значению


Страниц : [1] 2

Technik_spat
02-07-2021, 11:42
Здравствуйте!
Помогите, пожалуйста, с советом.
У меня по работе скриптов, формируется два файла 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
огромный массив данных. »
Огромный — это сколько?

Technik_spat
02-07-2021, 12:29
До 400 000 строк

Iska
03-07-2021, 03:34
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 с искомым содержимым.

Например:

https://i.imgur.com/Kf5XP0s.png

Technik_spat
03-07-2021, 08:03
C:\Windows\SysWOW64 »
ОГРОМНОЕ СПАСИБО)))) ОТРАБОТАЛО ОТЛИЧНО!!!!

Iska
03-07-2021, 13:33
Technik_spat, сколько по времени у Вас вышло?

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

Iska
03-07-2021, 19:04
отработало до 17 000 строк (остальные тупо отвалились на этапе отбора по фильтру) »
Не — это значит, что отработало все:
До 400 000 строк »

в районе 1-3 минут. »
Спасибо, ясно.

DJ Mogarych
04-07-2021, 14:27
А в 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
А в Powershell сколько будет выполняться? (Подразумевается версия 5.1) »
Поуэершелл не проходит.

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

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

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

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

DJ Mogarych
05-07-2021, 10:00
Версия Powershell какая?
host

Technik_spat
05-07-2021, 11:20
Версия Powershell какая? »
Name : Windows PowerShell ISE Host
Version : 2.0

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

Iska
05-07-2021, 16:30
Technik_spat, какая ОС?

Technik_spat
06-07-2021, 08:35
Technik_spat, какая ОС? »
Win 7 Pro x64 SP1

Iska
06-07-2021, 09:23
Technik_spat, 5.1 должна ставиться.

DJ Mogarych
06-07-2021, 09:42
https://docs.microsoft.com/ru-ru/powershell/scripting/windows-powershell/wmf/setup/install-configure?view=powershell-7.1#download-and-install-the-wmf-51-package

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

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

DJ Mogarych
06-07-2021, 12:08
По ссылке, которую я дал, нужно поставить .NET Framework 4.5.2 как предварительное требование, и потом ставить уже сам WMF 5.1.

Technik_spat
07-07-2021, 09:21
Я там наверху подправил скрипт, забыл фильтр на 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
Ругается »
это из-за двойного ;; при переводе в 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}
}
}
}
}




© OSzone.net 2001-2012