如何将单元格中的 CSV 值求和?

如何将单元格中的 CSV 值求和?

我是 stackexchange 的新手,对 TeX 也还很陌生。

我曾尝试搜索类似的问题,但一无所获。

我正在处理一个文档,需要从 csv 文件中生成一个表格。数据不应按原样填充,而应填充与表格中每个单元格对应的值的数量(如下所述)。我附上了一张显示我想要的最终结果的图片和一个显示表格的 MWE(我不知道如何给单元格着色,并在不混淆单元格格式的情况下将标签“Konsekvens”和“Sannolikhet”放在正确的位置)以及一些应导致图片中表格的示例数据。

例如,对于数据集中的每个 4,4,右上角的单元格应该增加,从而导致该单元格中的值为 7,因为共有 7 个 4,4。

数据仅为示例数据,因此表格可能与图像略有不同。

一个小问题是我无法像图m{2cm}中这样工作p{2cm}这里

我尝试过 datatool,但我唯一的想法是使用变量,但使用 16 个变量感觉是一个复杂的解决方案,我希望它可以以更好的方式完成,这就是我在这里寻求帮助的原因。

带值的表格

\documentclass{article}

\usepackage{filecontents}
\usepackage{multirow}
\usepackage{graphicx}

\begin{filecontents*}{mycsvdata.csv}
Sannolikhet,Konsekvens
4,4
4,4
4,4
4,4
4,4
4,4
4,4
4,3
4,2
4,2
2,4
2,4
2,4
2,4
2,2
1,4
1,4
1,4
1,4
1,4
1,3
1,3
1,2
1,1
\end{filecontents*}

\begin{document}
\begin{tabular}{c|p{2cm}|p{2cm}|p{2cm}|p{2cm}|p{2cm}|}
\cline{2-6}
   \multirow{5}{*}{\rotatebox{90}{Konsekvens}}
                     & Mycket allvarlig&~&~&~&~ \\[0.5cm]\cline{2-6}
        & Allvarlig&~&~&~&~ \\[0.5cm]\cline{2-6}
        & Måttlig&~&~&~&~ \\[0.5cm]\cline{2-6}
        & Försumbar&~&~&~&~ \\[0.5cm]\cline{2-6}
   \multicolumn{1}{l}{}&~&Osannolik&Möjlig&Sannolikt&Mycket sannolikt \\\cline{3-6}
     \multicolumn{6}{r}{Sannolikhet}
\end{tabular}

\end{document}

答案1

如果你不介意异国情调Lua 编程...

在此处输入图片描述

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{colortbl}
\usepackage{multirow}
\usepackage{graphicx}
\usepackage{array}
\usepackage{luacode}
\usepackage{hhline}
\usepackage{xcolor}


\begin{document}

\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}

\begin{luacode*}

local table_str = [[
\begin{tabular}{c|M{2cm}|M{2cm}|M{2cm}|M{2cm}|M{2cm}|}
\hhline{~|*{5}-}
   \multirow{5}{*}{\rotatebox{90}{Konsekvens}}
                     & Mycket allvarlig&@&@&@&@ \\[0.5cm]\hhline{~|*{5}-}
        & Allvarlig&@&@&@&@ \\[0.5cm]\hhline{~|*{5}-}
        & Måttlig&@&@&@&@ \\[0.5cm]\hhline{~|*{5}-}
        & Försumbar&@&@&@&@ \\[0.5cm]\hhline{~|*{5}-}
   \multicolumn{1}{l}{}&~&Osannolik&Möjlig&Sannolikt&Mycket sannolikt \\\hhline{~|~|*{4}-}
     \multicolumn{6}{r}{Sannolikhet}
\end{tabular}
]]

local result_table = {}
for i=1,4 do
    result_table[i] = {}
    for j=1,4 do
        result_table[i][j] = 0
    end
end

local line_num = 0
for line in io.lines('mycsvdata.csv') do
    if line_num ~= 0 then
        local stripped_line = string.gsub(line, '%s', '')
        local comma_pos = string.find(line, ',')
        if comma_pos ~= nil then
            local left = tonumber(stripped_line:sub(1, comma_pos - 1))
            local right = tonumber(stripped_line:sub(comma_pos + 1))
            result_table[left][right] = result_table[left][right] + 1
        end
    end
    line_num = line_num + 1
end

for i=0,15 do
    local y = 4 - math.floor(i / 4)
    local x = i % 4 + 1
    local cell_num = result_table[x][y]
    local cell_str = tostring(cell_num)
    if cell_num == 0 then
        cell_str = ''
    end
    if y+x <= 4 then
        cell_str = [[{\cellcolor{green!50}}]] .. cell_str
    elseif x+y <= 5 then
        cell_str = [[\cellcolor{yellow!50}]] .. cell_str
    elseif x+y <= 6 then
        cell_str = [[\cellcolor{orange!50}]] .. cell_str
    else
        cell_str = [[\cellcolor{red!50}]] .. cell_str
    end
    
    local new_str, sub_count = string.gsub(table_str, '@', cell_str, 1)
    table_str = new_str
end

local out_str, _ = string.gsub(table_str, '\n', '')
tex.print(out_str)

\end{luacode*}


\end{document}

答案2

我对这个解决方案并不完全满意,但我现在有了一个可以运行的代码。我想我也可以分享它,这样其他人就可以使用它。

我仍然希望“Sannolikhet”在最后四列中居中,但当我这样做时,我得到了不应该出现的垂直线。我还希望“Konsekvens”在顶部四行中垂直居中。

结果: 在此处输入图片描述

代码:

\documentclass{article}

\usepackage{filecontents}
\usepackage{multirow}
\usepackage{graphicx}
\usepackage[table]{xcolor}
\usepackage{hhline}
\usepackage{datatool}
\usepackage{array}

\begin{filecontents*}{mycsvdata.csv}
Sannolikhet;Konsekvens
4;4
4;4
4;4
4;4
4;4
4;4
4;4
4;3
4;2
4;2
2;4
2;4
2;4
2;4
2;2
1;4
1;4
1;4
1;4
1;4
1;3
1;3
1;2
1;1
\end{filecontents*}

\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}

\definecolor{orangex}{RGB}{255,205,55}
\definecolor{greenx}{RGB}{146,208,80}

\newcounter{AA}
\newcounter{AB}
\newcounter{AC}
\newcounter{AD}
\newcounter{BA}
\newcounter{BB}
\newcounter{BC}
\newcounter{BD}
\newcounter{CA}
\newcounter{CB}
\newcounter{CC}
\newcounter{CD}
\newcounter{DA}
\newcounter{DB}
\newcounter{DC}
\newcounter{DD}

\DTLsetseparator{;}

\begin{document}

\DTLloaddb{riskvarde}{mycsvdata.csv}
\DTLforeach*{riskvarde}{\Sannolikhet=Sannolikhet,\Konsekvens=Konsekvens}{
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{11}}{\stepcounter{AA}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{12}}{\stepcounter{AB}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{13}}{\stepcounter{AC}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{14}}{\stepcounter{AD}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{21}}{\stepcounter{BA}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{22}}{\stepcounter{BB}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{23}}{\stepcounter{BC}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{24}}{\stepcounter{BD}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{31}}{\stepcounter{CA}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{32}}{\stepcounter{CB}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{33}}{\stepcounter{CC}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{34}}{\stepcounter{CD}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{41}}{\stepcounter{DA}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{42}}{\stepcounter{DB}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{43}}{\stepcounter{DC}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{44}}{\stepcounter{DD}}{}
}


\begin{tabular}{c|M{2cm}|M{2cm}|M{2cm}|M{2cm}|M{2cm}|}




\hhline{~|*{5}-}
   \multirow{5}{*}{\rotatebox{90}{Konsekvens}}
                     & Mycket allvarlig&\cellcolor{yellow!75}\ifthenelse{\theAD>0}{\theAD}{}&\cellcolor{orangex}\ifthenelse{\theBD>0}{\theBD}{}&\cellcolor{red!50}\ifthenelse{\theCD>0}{\theCD}{}&\cellcolor{red!50}\ifthenelse{\theDD>0}{\theDD}{} \\\hhline{~|*{5}-}
        & Allvarlig\newline&\cellcolor{greenx}\ifthenelse{\theAC>0}{\theAC}{}&\cellcolor{yellow!75}\ifthenelse{\theBC>0}{\theBC}{}&\cellcolor{orangex}\ifthenelse{\theCC>0}{\theCC}{}&\cellcolor{red!50}\ifthenelse{\theDC>0}{\theDC}{} \\\hhline{~|*{5}-}
        & Måttlig\newline&\cellcolor{greenx}\ifthenelse{\theAB>0}{\theAB}{}&\cellcolor{greenx}\ifthenelse{\theBB>0}{\theBB}{}&\cellcolor{yellow!75}\ifthenelse{\theCB>0}{\theCB}{}&\cellcolor{orangex}\ifthenelse{\theDB>0}{\theDB}{} \\\hhline{~|*{5}-}
        & Försumbar\newline&\cellcolor{greenx}\ifthenelse{\theAA>0}{\theAA}{}&\cellcolor{greenx}\ifthenelse{\theBA>0}{\theBA}{}&\cellcolor{greenx}\ifthenelse{\theCA>0}{\theCA}{}&\cellcolor{yellow!75}\ifthenelse{\theDA>0}{\theDA}{} \\\hhline{~|*{5}-}
        \multicolumn{1}{l}{}&~&Osannolik&Möjlig&Sannolikt&Mycket sannolikt \\ \hhline{~|~|*{4}-}
        \multicolumn{6}{r}{Sannolikhet}
\end{tabular}

\end{document}

相关内容