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

bashCSV 구문 분석에 대한 기본 지원은 없습니다. CSV 구문 분석을 지원하는 방법을 사용할 수 있습니다 (적어도 텍스트가 ksh93큰따옴표 안에 입력되는 일부 형식의 CSV)."""read -S

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

또는 csv의 정확한 형식에 맞게 조정할 수 있는 적절한 CSV 구문 분석 라이브러리와 함께 perl/를 사용하세요. pythonperl:

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

POSIX 셸(예: )을 사용하여 CSV 필드의 내용에 큰따옴표, 쉼표 또는 줄 바꿈이 포함되지 않도록 보장할 수 있는 경우 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

관련 정보