需要解析 csv 文件,它应该存储在变量中

需要解析 csv 文件,它应该存储在变量中

我需要解析 csv 文件并将值存储在变量中。以下是示例 csv 文件

示例 CSV 文件

下面是./script.sh

#!/bin/bash

D="";

P="";

./xyz --project "$P" --displayname "$D"

例如,如果我们考虑第一行:

当我运行脚本时

./script.sh /home/project.csv

它应该存储值:10V nmos and pmos for MAinto$D10v_nmos_and_pmos_for_mainto $P

如何才能做到这一点 ?

另一种情况是,从 csv 文件中,如果我调用前三个项目,那么它应该在循环中逐行运行

答案1

bash没有对解析 CSV 的内置支持。您可以使用ksh93支持解析 CSV(至少是某种形式的 CSV,即在双引号内"输入文字的形式)的方法:""read -S

#! /bin/ksh93 -
while IFS=, read -rSu3 P D ignore; do
  ./xyz --project "$P" --displayname "${D#*.}"
done 3< file.csv

或者将perl/python与适当的 CSV 解析库一起使用,您可以调整该库以适应 csv 的确切格式。示例perl

perl -C -MText::CSV -e '
  $c = Text::CSV->new;
  while (($p, $d) = @{$c->getline(STDIN)}) {
    $d =~ s/.*?\.//;
    system "./xyz", "--project", $p, "--displayname", $d;
  }' < file.csv

如果您可以保证 CSV 字段的内容不包含双引号、逗号或换行符,使用 POSIX shell,例如bash,您可以这样做:

tr -d \" < file.csv | while IFS=, read -r p d ignore; do
  ./xyz --project "$p" --displayname "${d#*.}"
done

答案2

这假设CSV 中非常可靠地出现了 ' ,' 和 ' ' 字符:.

#!/bin/bash
cat "$1" | while IFS='' read -r line; do
    D="$(echo "$line" | cut -d ',' -f 1 | tr -d '"')"
    P="$(echo "$line" | cut -d '.' -f 2)"
    echo 'D: '"$D"
    echo 'P: '"$P"
    ./xyz --project "$P" --displayname "$D"
done

相关内容