如何在Org-mode中保留表格输出并读取单元格结果为结构化表格?
Org-mode中保留SPARQL表格输出同时结构化处理数据
问题场景
你在Org-mode文档里创建了标注为raw-dataset的SPARQL代码块,从Wikidata获取表格形式的查询结果。出于教学需求,你不想在SPARQL查询里过滤以Q1开头的行,打算用第二个代码块处理数据,但读取raw-dataset结果时所有内容被合并成单行,没法用grep等工具过滤;同时你不想修改raw-dataset的输出(导出网页时要显示美观表格),需要解决如何保留原表格输出的同时轻松清洗数据,或把结果读取为结构化表格的问题。
解决方案
1. 让SPARQL代码块同时输出表格和结构化文件(推荐)
给SPARQL代码块添加参数,让它在生成网页可见的表格同时,导出一份CSV格式的结构化文件,供后续代码块调用。这样既不影响网页展示,又能轻松用命令行工具处理数据:
#+NAME: raw-dataset #+BEGIN_SRC sparql :results output table :exports both :file raw_data.csv :extra-args ("--format" "csv") SELECT ?item ?label WHERE { ?item rdfs:label ?label . # 你的SPARQL查询内容,不做Q1过滤 } #+END_SRC
然后用第二个bash代码块读取CSV文件过滤数据:
#+BEGIN_SRC bash :var input_file=raw_data.csv # 过滤掉以Q1开头的行 grep -v "^Q1" "$input_file" #+END_SRC
2. 直接用Emacs Lisp处理Org表格
如果不想生成额外文件,可以把SPARQL的结果捕获为Org表格对象,用Emacs Lisp直接过滤行,结果依然保持表格格式:
#+NAME: raw-dataset #+BEGIN_SRC sparql :results table :exports both SELECT ?item ?label WHERE { ?item rdfs:label ?label . # 你的SPARQL查询内容 } #+END_SRC #+NAME: cleaned-dataset #+BEGIN_SRC emacs-lisp :var raw_table=raw-dataset ; 过滤掉第一列以Q1开头的行 (cl-remove-if (lambda (row) (string-prefix-p "Q1" (car row))) raw_table) #+END_SRC #+RESULTS: cleaned-dataset
3. 解析单行输出为结构化数据(应急方案)
如果没法修改raw-dataset的参数,只能处理合并后的单行内容,可以利用Org表格的竖线分隔特性,用awk拆分并过滤:
#+NAME: raw-dataset #+BEGIN_SRC sparql :results output :exports both SELECT ?item ?label WHERE { ?item rdfs:label ?label . # 你的SPARQL查询内容 } #+END_SRC #+BEGIN_SRC bash :var raw_output=raw-dataset # 将换行转成竖线,按竖线拆分后过滤掉Q1开头的项,再清理空行 echo "$raw_output" | tr '\n' '|' | awk -F'|' '{ for(i=1; i<=NF; i++) { if($i !~ /^Q1/ && $i !~ /^[[:space:]]*$/) print $i } }' #+END_SRC
内容的提问来源于stack exchange,提问作者lukascbossert
相关产品推荐
相关产品推荐

