我有一个函数,它从表中抓取单元格并返回它们。其中许多单元格以两个星号结尾,如果存在这些单元格,我不希望函数返回它们。例如:
% Function to get data
\def\getdata#1#2{%
\pgfplotstablegetelem{#1}{#2}\of{\table}\pgfplotsretval%
}
如果返回值如“2.3**”,则我想要“2.3”。谢谢,我认为这相当简单。
答案1
pgfplotstable
提供了在通过键从表中读取数据时忽略字符列表的可能性ignore chars={}
。
\documentclass{article}
\usepackage{pgfplotstable}
\begin{filecontents*}{scientists.csv}
name,surname,age
Alb*ert,Einstein**,133
Marie**,Curie,145
Thomas,Edis**on,165**
\end{filecontents*}
\pgfplotstableread[col sep=comma,ignore chars={*}]{scientists.csv}\mytable
\def\getcell#1#2#3{%
\pgfplotstablegetelem{#1}{#2}\of{#3}\pgfplotsretval%
}
\begin{document}
\pgfplotstabletypeset[
string type,
columns/name/.style={column name=Name, column type={|l}},
columns/surname/.style={column name=Surname, column type={|l}},
columns/age/.style={column name=Age, column type={|c|}},
every head row/.style={before row=\hline,after row=\hline},
every last row/.style={after row=\hline},
]\mytable
\bigskip
\getcell{0}{name}{\mytable} \getcell{0}{surname}{\mytable} is \getcell{0}{age}{\mytable}
years old. \getcell{1}{name}{\mytable} \getcell{1}{surname}{\mytable} is
\getcell{1}{age}{\mytable} years old. But \getcell{2}{name}{\mytable}
\getcell{2}{surname}{\mytable} is still older, he is \getcell{2}{age}{\mytable} years old.
\end{document}
但是,由于此方法会吞噬星号的每个实例,因此应小心谨慎。例如,Alb*ert
也会被修改。因此,必须小心谨慎 (x2)。
答案2
我确信有人会想出一个 LaTeX 解决方案。但与此同时,我会先使用 perl 或 ruby 中的 shell 脚本或可以使用正则表达式替换的脚本来解决这个问题,然后先通过 shell 脚本运行数据。
这是一个 shell 脚本(使用 perl 编写),它将删除*
。将此脚本保存在文件中并将其命名为script.pl
。我假设数据文件的名称为data.txt
。在命令提示符下,运行
$ perl script.pl data.txt
这会将重新格式化的数据打印到控制台。要将其捕获到另一个文件中:
$ perl script.pl data.txt > reformatted_data.txt
这样,您仍然可以按自己的意愿处理原始数据,并且数据中不包含星号。
这是 perl 脚本:
#!/usr/bin/perl
use strict 'vars';
&MAIN(@ARGV);
sub MAIN {
my ($filehandle) = @_;
open FILE, "<$filehandle";
my @filecontents = <FILE>;
close FILE;
foreach my $line ( @filecontents ){
$line =~ s/\*//g;
print $line;
}
}
希望这可以帮助。