Skip to content

Commit f49e385

Browse files
committed
完成项目的重构,setup,出新版本
1 parent 133c36b commit f49e385

File tree

7 files changed

+247
-284
lines changed

7 files changed

+247
-284
lines changed

Diff for: README.md

+47-113
Original file line numberDiff line numberDiff line change
@@ -1,153 +1,87 @@
1-
# jsoncsv
2-
将多层次的json转为一层次的json,再转成csv或者xlsx
1+
# jsoncsv
32

4-
**展开为1层json**
3+
将多层次的json转为一层次的json,再转成csv或者xlsx 的工具
54

65
```
7-
echo '{"s":[1,2,{"w":1}]}'|./jsoncsv.py -e |jq -r ''
8-
{
9-
"s.2.w": 1,
10-
"s.0": 1,
11-
"s.1": 2
12-
}
6+
cat raw.json|jsoncsv|mkexcel > output.csv
7+
cat raw.json|jsoncsv|mkexcel -t xls > output. xls
138
```
14-
**制作xlsx**
159

16-
```
17-
cat raw.json|./jsoncsv.py -e |./mkexcel.py > test.csv
18-
cat raw.json|./jsoncsv.py -e |./mkexcel.py -t xls > test.xls
19-
```
20-
21-
22-
23-
## 来源说明
24-
因为做爬虫时,经常数据是json 格式的,而很多**客户需要看excel 的,需要耗费人力去填表格。
25-
26-
这两个文件可以连用,可以从原始json(可以用 `jq` 先做一些处理)到csv/xlsx一步完成。
27-
28-
最后再根据具体含义,更改xlsx文件的标题,使有明确含义
29-
30-
## 功能介绍
31-
32-
jsoncsv.expand 展开 多层json
33-
jsoncsv.restore 重构 单层json
3410

35-
mkexcel 代码暂时还没有分割清楚
36-
37-
38-
### 展开 expand 与 restore 重构
39-
**jsoncsv.expand** 函数 展开
11+
## 1. jsoncsv
4012

13+
```bash
14+
echo '{"s":[1,2,{"w":1}]}'|jsoncsv
15+
{"s.2.w": 1,"s.0": 1,"s.1": 2}
4116
```
42-
echo '[1,2,3,4]'|./jsoncsv.py -e
43-
{"1": 2, "0": 1, "3": 4, "2": 3}
44-
45-
echo '"sss"'|./jsoncsv.py -e
46-
{"": "sss"}
47-
48-
echo '1'|./jsoncsv.py -e
49-
{"": 1}
50-
51-
echo '{"s":[1,2,{"w":1}]}'|./jsoncsv.py -e
52-
{"s.2.w": 1, "s.0": 1, "s.1": 2}
5317

54-
```
18+
### -e -r
5519

56-
**jsoncsv.restore** 恢复
57-
58-
每一组第一行是展开,第二行是对展开的结果重构,注意结果对比原始数据
20+
`-e`,`--expand` expand 展开 json 数据
5921

6022
```
61-
echo '[1,2,3,4]'|./jsoncsv.py -e
62-
{"1": 2, "0": 1, "3": 4, "2": 3}
63-
echo '[1,2,3,4]'|./jsoncsv.py -e|./jsoncsv.py -r
64-
[1, 2, 3, 4]
65-
66-
echo '1'|./jsoncsv.py -e
67-
68-
{"": 1}
69-
echo '1'|./jsoncsv.py -e|./jsoncsv.py -r
70-
1
71-
72-
echo '"sss"'|./jsoncsv.py -e
73-
{"": "sss"}
74-
echo '"sss"'|./jsoncsv.py -e|./jsoncsv.py -r
75-
"sss"
76-
77-
echo '{"s":[1,2,{"w":1}]}'|./jsoncsv.py -e
78-
79-
{"s.2.w": 1, "s.0": 1, "s.1": 2}
80-
echo '{"s":[1,2,{"w":1}]}'|./jsoncsv.py -e|./jsoncsv.py -r
81-
{"s": [1, 2, {"w": 1}]}
23+
jsoncsv -e raw.json
24+
{"s":[1,2,{"w":1}]} ----> {"s.2.w": 1,"s.0": 1,"s.1": 2}
25+
```
26+
`-r`,`--restore` restore 重构被展开的json
8227

28+
```
29+
jsoncsv -r expand.json
30+
{"s.2.w": 1,"s.0": 1,"s.1": 2} ----> {"s": [1, 2, {"w": 1}]}
8331
```
8432

33+
### -s
8534

86-
如上,将各种类型的json数据转化层单层的
87-
#### 此版本要求
88-
1. 原始json 的 各级key不能包含".",因为`.`是expand后key的连接字符。
89-
2. 字典key中不能混杂数字。如果全部的key都是数字,恢复重构时会被当成list类型。
35+
`-s`,`--separator` default is `.`
9036

91-
例如
37+
## 2.mkexcel
9238

9339
```
94-
echo '{"0":1,"2":[1,2]}'|./jsoncsv.py -e
95-
{"0": 1, "2.1": 2, "2.0": 1}
96-
97-
echo '{"0":1,"2":[1,2]}'|./jsoncsv.py -e|./jsoncsv.py -r
98-
[1, [1, 2]]
40+
cat expand.json|mkexcel -o output.csv
41+
cat expnad.json|mkexcel -t xls > output.xls
9942
```
100-
其中恢复重构(`-r`参数)时候,将数字的 "0","2",因为是全是数字,被当成list的恢复了(按照 0,2 排序的结果,没有刻意管理索引值)。
101-
102-
103-
## 格式转换
104-
使用 mkexcel.py 文件,接受一个层次的json文件
10543

106-
即可以使用上面`jsoncsv.py`展开的的json,dump为需要的格式(csv/xls)
10744

108-
`cat raw.json|./jsoncsv.py -e |./mkexcel.py -t xls > test.xls`
45+
### -t -o
10946

110-
其中 `./jsoncsv.py -e``-e`参数就是展开为一层数据,mkexcle 读取数据即可得到指定的格式
47+
`-t`,`--type` dump type `['csv', 'xls']`
11148

112-
### csv
113-
`csv` 是默认格式
11449
```
115-
cat expand.json|./mkexcel.py > test.csv
116-
cat expand.json|./mkexcel.py -t csv > test.csv
117-
./mkexcel.py expand.json text.csv
118-
./mkexcel.py expand.json > text.csv
50+
cat expand.json|mkexcel -t csv > output.csv
51+
cat expand.json|mkexcel -t xls > output.xls
11952
```
120-
121-
### xlsx
12253

123-
使用`-t xls``--type xls`,声明dump 为 xls 格式
54+
`-o`,`--output` 指定输出文件
12455

125-
```
126-
cat expand.json|./mkexcel.py -t xls > test.xls
127-
./mkexcel.py -t xls expand.json text.csv
128-
./mkexcel.py -t xls expand.json > text.csv
129-
```
13056

57+
## NOTE
13158

132-
## 实践
133-
134-
具体实践样例参考某次[爬虫外包](https://github.com/alingse/crawler/tree/master/projects/sfda.gov)的数据处理过程
135-
(**旧版本下的,应该需要相应调整**)
136-
137-
## 测试
59+
1. 原始json 的 各级key不能包含".",因为`.`是expand后key的连接字符。
60+
61+
key can't contains separator `.`
62+
63+
下个版本会考虑这个问题
64+
65+
2. 字典key中不能混杂数字。如果全部的key都是数字,恢复重构时会被当成list类型。
13866

139-
简单的 unittest
140-
```
141-
python -m unittest test.test
142-
```
67+
example:
68+
69+
```
70+
echo '{"0":1,"2":[1,2]}'|jsoncsv -e| jsoncsv -r
71+
[1, [1, 2]]
72+
```
14373

14474
## TODO
14575

14676
以下按顺序来做,
14777

14878
1. <s>增加unittest</s> 完成,
14979
2. 更多的出错检查
150-
3. <s>把文件读写从jsoncsv 中分离出来看</s> 暂时没必要
80+
3. <s>把文件读写从jsoncsv 中分离出来看</s>
15181
4. <s>mkexcel 重构</s> 完成
152-
5. 构建包
82+
5. <s>构建包</s> 完成
83+
6. 支持 separator 的转义
84+
7. mkexcel 的效率
85+
8. mkexcel csv xls dump 的 重构
86+
9. dumptool.dump_xls 对 int 日期等支持
15387

Diff for: jsoncsv/__init__.py

+4-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
1-
#coding=utf-8
2-
#author@alingse
3-
#2016.09.30
1+
# coding=utf-8
2+
# author@alingse
3+
# 2016.09.30
44

5-
from .jsontool import expand
6-
from .jsontool import restore
7-
8-
from . import mkexcel
9-
10-
__all__ = ('expand','restore','mkexcel')
11-
12-
__version__ = (0,0,1)
5+
__version__ = (2, 0, 1)

Diff for: jsoncsv/mkexcel.py renamed to jsoncsv/dumptool.py

+9-44
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
1-
#!/usr/bin/python
2-
#coding=utf-8
3-
#author@alingse
4-
#2015.10.09
1+
# coding=utf-8
2+
# author@alingse
3+
# 2015.10.09
54

6-
import argparse
7-
#import xlwt
85
import json
9-
import sys
6+
import xlwt
107

118

129
def patch_none(row):
1310
for i in range(len(row)):
14-
if row[i] == None:
11+
if row[i] is None:
1512
row[i] = ""
1613
return row
1714

1815

19-
patch_encode = lambda row: [ele.encode('utf-8') for ele in row]
16+
def patch_encode(row):
17+
18+
return [ele.encode('utf-8') for ele in row]
2019

2120

2221
def patch_str(row):
@@ -26,7 +25,6 @@ def patch_str(row):
2625
return row
2726

2827

29-
#patch
3028
def patch_datas(datas):
3129
datas = map(patch_none, datas)
3230
datas = map(patch_str, datas)
@@ -66,7 +64,6 @@ def dump_csv(headers, datas, fout):
6664

6765

6866
def dump_xls(headers, datas, fout):
69-
import xlwt
7067
wb = xlwt.Workbook(encoding='utf-8', style_compression=0)
7168
ws = wb.add_sheet('Sheet1')
7269

@@ -86,39 +83,7 @@ def dump_xls(headers, datas, fout):
8683
fout.flush()
8784

8885

89-
def main(fin, fout, dumpf):
86+
def dumpfile(fin, fout, dumpf):
9087
headers, datas = load_files(fin)
9188
datas = patch_datas(datas)
9289
dumpf(headers, datas, fout)
93-
94-
95-
if __name__ == '__main__':
96-
parser = argparse.ArgumentParser()
97-
parser.add_argument('-t',
98-
'--type',
99-
choices=['csv', 'xls'],
100-
default='csv',
101-
help='choose dump format')
102-
parser.add_argument('input',
103-
nargs='?',
104-
help='input file, default is stdin')
105-
parser.add_argument('output',
106-
nargs='?',
107-
help='output file, default is stdout')
108-
args = parser.parse_args()
109-
110-
#default dump
111-
dumpf = dump_csv
112-
if args.type == 'xls':
113-
import xlwt
114-
dumpf = dump_xls
115-
116-
#default
117-
fin = sys.stdin
118-
fout = sys.stdout
119-
if args.input != None:
120-
fin = open(args.input, 'r')
121-
if args.output != None:
122-
fout = open(args.output, 'w')
123-
124-
main(fin, fout, dumpf)

0 commit comments

Comments
 (0)