Показать полную графическую версию : Копирование колонок из dbf в txt (csv)
Technik_spat
06-01-2024, 10:22
Форумчане, здравствуйте!
Нужна помощь в решении задачи:
есть два файла вывода данных 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
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:
https://gist.github.com/mavericksevmont/3b02879737778dc23ba4c5c3c7a8ee57 - не понимает кодировку русских букв без настройки, не стал разбираться.
https://www.dbf2002.com/dbf-converter/convert-dbf-to-csv.html - использован в скрипте.
https://www.convert-in.com/dbf2csv.htm - не пробовал.
Technik_spat,
Ещё есть варианты на основе powershell, но с установкой доп.модуля или сторонней библиотеки:
1. https://github.com/Delapro/PSDBF
2. https://gist.github.com/mavericksevmont/3b02879737778dc23ba4c5c3c7a8ee57
- уже есть ссылка в сообщении выше
или вариант на питоне (тоже потребуется установка доп. батарейки)
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
Премного БЛАГОДАРЕН))))))
Буду дальше скрипт pwsh развивать)))))
К сожалению, с пайтоном вообще не знаком((((((
Technik_spat
10-01-2024, 16:42
К сожалению файл через питон не сохраняется
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
Technik_spat,
подробности бы...
А так, в соответствии с первым постом:
python »
Скрипт отрабатывает, но файл не создается.
Вообще первоначальная задача:
из файла sprav.dbf ивзлечь 2 и 18 колонки, а ещё бы сразу в ANSI преобразовать.
но файл не создается. »
Покажите результат работы скрипта, то, что отображается в консоли.
Вообще первоначальная задача »
Вы можете отредактировать стартовый пост в этом топике и изложить задачу так, как необходимо.
Пример того, что должно получится в итоге и того файла, откуда необходимо получать данные, тоже надо бы добавить.
ещё бы сразу в ANSI преобразовать. »
ANSI — стандарты ANSI (American National Standards Institute, Национальный институт стандартизации США).
А вот какая кодировка требуется, это надо уточнить. :)
Доступные кодировки (https://docs.python.org/3/library/codecs.html#standard-encodings)
Предполагаю, что требуется 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
»
Вы знаете, задача отпала в том виде в котором она вообще есть)))))
СПАСИБО ВСЕМ ЗА ПОМОЩЬ))))
"Не спеши выполнять работу, её могут отменить" :)
Technik_spat
12-01-2024, 13:14
"Не спеши выполнять работу, её могут отменить" »
Там пошло такое усложнение, что я сейчас ломаю голову, как бы разбить процессы)
Там пошло такое усложнение, что я сейчас ломаю голову, как бы разбить процессы »
Проблема может оказаться более простой, если попытаться описать задачу в целом...
А что по другой задаче? Подошло это решение (http://forum.oszone.net/post-3022602.html#post3022602) по скорости?
Technik_spat
13-01-2024, 06:57
А что по другой задаче? Подошло это решение по скорости? »
Проверить не успели))))
Удалось многое в таблице базы программы отрезать.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.