合并两个.csv 文件并添加缺失的行?

合并两个.csv 文件并添加缺失的行?

我有两个文件。A.csv

date,colA
2016-01-01,1
2016-01-02,4
2016-01-03,2

B.csv

date,colB
2016-01-01,2
2016-01-03,4

我想把它们结合起来得到等价的东西:

date,colA,colB
2016-01-01,1,2
2016-01-02,4,0
2016-01-03,2,4

因此,我想将 colB 附加到原始数据中,并且所有缺失的日期B.csv都应添加值 0。结果数据将使用 pgfplots 绘制。

这可能吗LaTeX、pgfplots 或 pgfplotstable? 我们可以放心地假设它A.csv具有所有需要的日期。

B.csv或者是否可以在合并之前先添加缺失的行?

我当前的解决方案是手动添加缺失的行,然后使用\pgfplotstablecreatecol[copy column from table=...宏。

编辑:我正在使用 Overleaf,因此该解决方案也应该在那里有效。

答案1

好吧,如果你有 R 并且你承认knitr它是 LaTeX 解决方案,那么很简单:

姆韦

\documentclass{article}
\usepackage{verbatim,xcolor}
\begin{filecontents*}{A.csv}
date,colA
2016-01-01,1
2016-01-02,4
2016-01-03,2
\end{filecontents*}
\begin{filecontents*}{B.csv}
date,colB
2016-01-01,2
2016-01-03,4
\end{filecontents*}
\begin{document}
<<echo=F,results='asis'>>=
A <- read.csv(file="A.csv")
B <- read.csv(file="B.csv")
C <- merge(A,B,by="date", all=T)
C[is.na(C)] <- 0
write.csv(C, file="C.csv",quote=F,row.names=F) 
@
Contents of \fcolorbox{gray}{gray!20}{\texttt{C.csv}}:~~~~~
\parbox{6cm}{\verbatiminput{C.csv}}
\end{document}

答案2

这个解决方案怎么样,不需要 R?仅使用 LaTeX 和datatool

\documentclass{article}
\usepackage{filecontents}
\usepackage{datatool}

\begin{filecontents*}{A.csv}
date,colA
2016-01-01,1
2016-01-02,4
2016-01-03,2
\end{filecontents*}

\begin{filecontents*}{B.csv}
date,colB
2016-01-01,2
2016-01-03,4
\end{filecontents*}

% \DTLloaddb{A}{A.csv}
\DTLloaddb{B}{B.csv}
\DTLloaddb{C}{A.csv}

\DTLforeach{C}{\Date=date}{
    \DTLgetvalueforkey{\tmp}{colB}{B}{date}{\Date}
    \DTLappendtorow{colB}{\DTLifnull{\tmp}{0}{\tmp}}
}

\begin{document}

\DTLsetseparator{,}
\DTLsetdelimiter{"}
\DTLsavedb{C}{C.csv} % doesn't write if before \begin{document}

\DTLdisplaydb{C}

\end{document}

相关内容