想做一个东西,cli 或者当 library 都可以用。大概是
python
main.py data.csv --transform "parser | get='name' | len==10 | original | parser | get='age'"
做的就是遍历所有行,parse 数据,找到“名字”长度为 10 的行,返回“age”
传输的数据:
class Item:
orignial: Any
value: Any
我写了 Parser, Len, GetField, Orignal 这几个 class 。初步计划是事先把 class 放到一个 dict 里,解析字符串为,并把操作符和数值拿来初始化 class
pipe_units = [
Parser(),
Get("=", "name"),
Len("==", "10"),
Original(),
Parser(),
Get("=", "name"),
]
然后 pipe = CompiledPipe(pipe_units)
wrapped_records = CsvReader(f) # 也是个 pipe unit
pipe.set_upstream(wrapped_records) # 或者 wrapped_records >> pipe
for out_record in pipe:
print(out_record)
这样的做法有什么明显缺陷吗?解析 pipe 字符串有什么比较好的方法吗?现在直接用 split 之类的方法来做,感觉很粗糙。这个 parse 动作,在业界有专有名词吗?谢谢各位
GeekGao
86 天前
```
from pyparsing import Word, alphanums, Suppress, Group, OneOrMore, Optional
def parse_pipeline(pipeline_string):
# 定义基本元素
command = Word(alphanums + "_")
argument = Word(alphanums + "_='")
pipe = Suppress("|")
# 定义命令结构
command_structure = Group(command + Optional(Group(OneOrMore(argument))))
# 定义整个管道结构
pipeline = OneOrMore(command_structure + Optional(pipe))
# 解析字符串
parsed = pipeline.parseString(pipeline_string)
result = []
for item in parsed:
if len(item) == 1:
result.append({"command": item[0], "args": []})
else:
result.append({"command": item[0], "args": item[1].asList()})
return result
# 使用
pipeline_str = "parser | get='name' | len==10 | original | parser | get='age'"
parsed_pipeline = parse_pipeline(pipeline_str)
print(parsed_pipeline)
```
Output:
```
[{'command': 'parser', 'args': []}, {'command': 'get', 'args': ["='name'"]}, {'command': 'len', 'args': ['==10']}, {'command': 'original', 'args': []}, {'command': 'parser', 'args': []}, {'command': 'get', 'args': ["='age'"]}]
```
抛砖引玉。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/1065193
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.