NuShell中批量打开Excel文件并精准搜索文本的实现方法
NuShell中批量打开Excel文件并精准搜索文本的实现方法
嗨,我完全懂你的需求——用NuShell批量处理Excel文件,精准定位包含指定文本的内容,还要清晰展示它所在的文件名、工作表和行号。之前直接用open "huge file.xlsx" | find todo得到的是整个文件的JSON串,确实没法直接用,咱们来一步步搞定这个问题~
先从单个Excel文件的处理说起
NuShell打开Excel后,会把每个工作表转换成表格结构,所以我们需要逐层遍历工作表和行,再筛选匹配的内容。比如要搜索文本todo,可以用下面的命令:
open "huge file.xlsx" # 给每个工作表带上名称标识 | enumerate --name sheet_name # 遍历每个工作表,处理里面的行数据 | flat-map { |sheet| $sheet.value # 给每一行加上行号(Nu的索引从0开始,后面要转成Excel的实际行号) | enumerate --index line_number # 检查当前行的任意单元格是否包含目标文本 | where any ($in | values | str contains "todo") # 整理需要展示的字段 | select { file: "huge file.xlsx" sheet: $sheet.sheet_name line: $line_number + 1 content: $in } } # 格式化成你想要的输出样式 | format "{file}, sheet {sheet}, line {line}: {content}"
运行这个命令后,就能得到类似你想要的结果:
huge file.xlsx, sheet Sheet1, line 5: ... todo ...
扩展到批量处理多个Excel文件
如果要处理当前目录下所有.xlsx文件,只需要在前面加上文件遍历的逻辑就行,命令如下:
# 获取当前目录下所有Excel文件 ls *.xlsx # 遍历每个文件 | each { |file| open $file.name | enumerate --name sheet_name | flat-map { |sheet| $sheet.value | enumerate --index line_number | where any ($in | values | str contains "todo") | select { file: $file.name sheet: $sheet.sheet_name line: $line_number + 1 content: $in } } } | format "{file}, sheet {sheet}, line {line}: {content}"
一些实用小调整
- 如果需要忽略大小写搜索,把
str contains "todo"改成str contains --ignore-case "todo"就行; - 如果要精确匹配单元格内容(而不是包含),可以换成
str equals "todo",或者根据需要调整where里的条件; - 如果Excel里有合并单元格,Nu的
open会把合并后的内容放在对应的字段里,这个搜索逻辑依然能正常工作。
备注:内容来源于stack exchange,提问作者user194860
相关产品推荐
相关产品推荐

