如何将INI文件转换为CSV文件

dsekswqp  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(230)

我想从一个数据列表创建一个csv,但是列表的各个部分的键值不同。列表的布局如下:

[Game 1]
Publisher=
Developer=
Released=Nov, 2005
Systems=
Genre=Action|Strategy
Perspective=3rd-Person Perspective
Score=4.5
Controls=
Players=
Rating=
Url=http://www.google.com.pl
Description=This cartridge contains six of the 1 kilobyte e......

[Game 2]
Publisher=Home Entertainment Suppliers Pty. Ltd.
Developer=Imagic
Released=1992
Systems=
Genre=Action
Perspective=3rd-Person Perspective
Score=1.5
Controls=Joystick (Digital)|Same/Split-Screen Multiplayer
Players=1-2 Players
Rating=
Url=http://www.google.com
Description=An unlicensed multi-cart from the Australian-bas.....
Goodname=2 Pak Special - Alien Force & Hoppy
NoIntro=
Tosec=2 Pak Special Light Green - Hoppy & Alien Force

Full file here
每个数据集由[Game *]分隔,每个游戏的值可以为空或不存在,例如游戏1中缺少Goodname=,NoIntro=和Tosec=。我不知道所需的键/列的总数。理想情况下,我希望每个游戏在csv文件中单独一行。
有人知道如何将这种格式的数据转换成csv吗?我被难倒了。我熟悉bash和python,但我愿意接受任何关于如何自动转换的建议。
先谢谢你了。

irlmq6kh

irlmq6kh1#

在Python中,你可以使用ConfigParser库来阅读INI file,使用csv库来编写逗号分隔的文件。我在下面写了一个小脚本ini2csv.py,你可以使用下面的命令来处理你的转换:

cat atari.ini | ./ini2csv.py > atari.csv

以下是脚本:

#!/usr/bin/python
# encoding: utf-8

import sys
import csv
from ConfigParser import ConfigParser

ini = ConfigParser()
ini.readfp(sys.stdin)

#Find all keys in the INI file to build a row template and 
#include a "game" field to store the section name.
rowTemplate = {"game":""} 
for sec in ini.sections():
   for key,value in ini.items(sec):
       rowTemplate[key] = "" 

#Write the CSV file to stdout with all fields in the first line
out = csv.writer(sys.stdout)
out = csv.DictWriter(sys.stdout, fieldnames=rowTemplate.keys())
out.writeheader()

#Write all rows
for sec in ini.sections():
   row = rowTemplate.copy()
   row["game"] = sec
   for key,value in ini.items(sec):
       row[key] = value
   out.writerow(row)

我用你在问题中提供的链接测试了它,它似乎按预期工作。

hs1ihplo

hs1ihplo2#

你确定你需要verbose python吗?Perl更快...

# vi ini2csv.pl 
 #! /usr/bin/perl
 my $c = "None" ;                   # $c is current category
 while(<>) {                        # parse diamond operator (STDIN+...)
   next if m/^[;\#]/ || m/^$/ ;     # skip comments and empty lines
   if (m/^\[([^\[])\]/) { $c = $1 } # switch current category 
   else { "$c\t$_"; }               # print with tabulation
 }

该脚本的使用方法如下,它输出一个CSV文件。

$ cat atari.ini | ini2csv.pl

相关问题