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

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

Technik_spat 06-01-2024 10:22 3022346

Копирование колонок из dbf в txt (csv)
 
Форумчане, здравствуйте!
Нужна помощь в решении задачи:
есть два файла вывода данных dbf и txt c структурой csv
Получается данные из первой и второй колонки файла dbf надо перенести в 21 столбец файла vvod через любой разделитель.
Причём прелесть задачи в том, что строки в dbf абсолютно соответствуют таковым в txt (кроме пропуска заголовка из 7 строк).
Помогите, пожалуйста, с решением задачи.
Т.е. есть такие строки:
138596;;;;;;;;;;;;;;;;;;;;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;0;;;0;1;;;;;;;;;;0;
138597;;;;;;;;;;;;;;;;;;;;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;0;;;0;1;;;;;;;;;;0;
А должно в конце выйти
138596;;;;;;;;;;;;;;;;;;;;Первая строк - 01/01/24;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;0;;;0;1;;;;;;;;;;0;
138597;;;;;;;;;;;;;;;;;;;;Вторая строк - 01/01/24;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;0;;;0;1;;;;;;;;;;0;
dbf пришлось закатать в архив, а то форум ругается.

DJ Mogarych 07-01-2024 06:01 3022372

Powershell
Код:

$dbfSrc = 'C:\temp\dbf\sprav.dbf'
$dbfCsv = 'C:\temp\dbf\sprav.csv'
$txtSrc = 'C:\temp\dbf\vvod.TXT'
$txtDst = 'C:\temp\dbf\vyvod.TXT'

& 'C:\Users\User\AppData\Local\Programs\DBF Converter\dbfcnv.exe' $dbfSrc $dbfCsv
$dbf = Import-Csv $dbfCsv -Encoding default -Header 1,2 |% {"$($_.1) - $($_.2)"}
$meta = gc $txtSrc -encoding utf8 |select -first 7
$csv = gc $txtSrc -encoding utf8 |select -skip 7 |ConvertFrom-Csv -Delimiter ';' -Header (1..66)

$c = 0
$csv |% {
    $_.21 = $dbf[$c]
    $c++
}

$meta |Out-File $txtDst -Encoding utf8
$csv |Convertto-Csv -delimiter ';' -NoTypeInformation |select -skip 1 |Out-File $txtDst -Encoding utf8 -Append

Конвертеры dbf2csv:

YuS_2 07-01-2024 08:13 3022374

Technik_spat,
Ещё есть варианты на основе powershell, но с установкой доп.модуля или сторонней библиотеки:
1. https://github.com/Delapro/PSDBF
2. https://gist.github.com/mavericksevm...a4c5c3c7a8ee57
- уже есть ссылка в сообщении выше
или вариант на питоне (тоже потребуется установка доп. батарейки)
cmd:
Код:

pip install dbfpy3
и сам код чтения на питоне:
Код:

from dbfpy3 import dbf

db = dbf.Dbf("sprav.dbf")
f = lambda x: x.decode('cp1251')
print(list(map(f,db.field_names)))
for item in db:
    print(list(item))

- если интересно, то можно написать код для конвертации...

Technik_spat 07-01-2024 08:43 3022375

Премного БЛАГОДАРЕН))))))
Буду дальше скрипт pwsh развивать)))))
К сожалению, с пайтоном вообще не знаком((((((

Technik_spat 10-01-2024 16:42 3022515

К сожалению файл через питон не сохраняется

YuS_2 10-01-2024 19:56 3022519

Technik_spat,
подробности бы...
А так, в соответствии с первым постом:
python
Код:

import os
from dbfpy3 import dbf
fin = 'vvod.txt'
fdbf = 'sprav.dbf'
fout = 'out.txt'
file_path = os.path.abspath(__file__)
os.chdir(os.path.dirname(file_path))
db = dbf.Dbf(fdbf)
out,i = [],0
z = [(item[0] + ' - ' + item[1]) for item in db]
with open(fin,"r", encoding='utf-8') as f:
    for line in f:
        if ';' in line:
            tmp = line.split(';')
            tmp[20] = z[i]
            out.append(';'.join(tmp))
            i += 1
        else:
            out.append(line)

with open(fout,'w',encoding='utf-8') as fw:
    for lin in out:
        fw.write(lin)

все файлы необходимо положить рядом с файлом скрипта python...

Technik_spat 10-01-2024 21:05 3022520

Цитата:

Цитата YuS_2
Technik_spat,
подробности бы...
А так, в соответствии с первым постом:
python »

Скрипт отрабатывает, но файл не создается.
Вообще первоначальная задача:
из файла sprav.dbf ивзлечь 2 и 18 колонки, а ещё бы сразу в ANSI преобразовать.

YuS_2 11-01-2024 07:46 3022533

Цитата:

Цитата Technik_spat
но файл не создается. »

Покажите результат работы скрипта, то, что отображается в консоли.
Цитата:

Цитата Technik_spat
Вообще первоначальная задача »

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

Цитата:

Цитата Technik_spat
ещё бы сразу в ANSI преобразовать. »

ANSI — стандарты ANSI (American National Standards Institute, Национальный институт стандартизации США).
А вот какая кодировка требуется, это надо уточнить. :)
Доступные кодировки
Предполагаю, что требуется Windows-1251, тогда:
Код:

import os
from dbfpy3 import dbf
# Файлы должны находиться рядом со скриптом,
# либо можно указать абсолютный путь к ним:
fin = 'vvod.txt'
fdbf = 'sprav.dbf'
fout = 'out.txt'

file_path = os.path.abspath(__file__)
os.chdir(os.path.dirname(file_path))
db = dbf.Dbf(fdbf)
out,i = [],0
z = [(item[0] + ' - ' + item[1]) for item in db]
with open(fin,"r", encoding='utf-8') as fr:
    for line in fr:
        if ';' in line:
            tmp = line.split(';')
            tmp[20] = z[i]
            out.append(';'.join(tmp))
            i += 1
        else:
            out.append(line)

with open(fout,'w',encoding='cp1251') as fw:
    fw.writelines(out)


Technik_spat 12-01-2024 08:18 3022588

Цитата:

Цитата YuS_2

Вы знаете, задача отпала в том виде в котором она вообще есть)))))
СПАСИБО ВСЕМ ЗА ПОМОЩЬ))))

YuS_2 12-01-2024 12:40 3022604

"Не спеши выполнять работу, её могут отменить" :)

Technik_spat 12-01-2024 13:14 3022607

Цитата:

Цитата YuS_2
"Не спеши выполнять работу, её могут отменить" »

Там пошло такое усложнение, что я сейчас ломаю голову, как бы разбить процессы)

YuS_2 12-01-2024 14:37 3022614

Цитата:

Цитата Technik_spat
Там пошло такое усложнение, что я сейчас ломаю голову, как бы разбить процессы »

Проблема может оказаться более простой, если попытаться описать задачу в целом...
А что по другой задаче? Подошло это решение по скорости?

Technik_spat 13-01-2024 06:57 3022660

Цитата:

Цитата YuS_2
А что по другой задаче? Подошло это решение по скорости? »

Проверить не успели))))
Удалось многое в таблице базы программы отрезать.


Время: 23:59.

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