challenge RFC 4180対応版 CSVレコードの分解

ある関数(splitCSV)に渡された文字列を配列に分解して列ごとに表示してください。
渡される文字列は、CSVデータの1レコードが設定されているとします。

使用するデータはK3形式が元になっている仕様で
エクセルが出力しているような形式です。

書式には次のような特徴があります。
1. 各レコードは「改行」によって区切られている。
2. 各列は「,」によって区切られている。
3. 列のデータは「"」によって囲んでも良い。
4. 列に「,」「改行」「"」いずれかを含む場合「"」で
   囲わなければならない。
5. 列データに「"」を含める場合「""」とする。

本来、改行コードはCRLFですが今回は特に指定しません。

次の入力があった場合
"aaa","b
bb","ccc",zzz,"y""Y""y",xxx

出力は
1 => aaa
2 => b
bb
3 => ccc
4 => zzz
5 => y"Y"y
6 => xxx

となります。
このお題はraynstardさんの投稿によるものです。ご投稿ありがとうございます。助かります。

Posted feedbacks - Bash

標準入力→標準出力です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function splitCSV() {
    local c in_dq after_dq
    local -i count=0

    while read -n 1 c; do
        if [ -z "$in_req" ]; then
            in_req=1
            echo -n "$((++count)) => "
        fi

        : ${c:=$'\n'}   # 改行は空文字として読まれる

        if [ "$c" = \" ]; then
            if [ -n "$after_dq" ]; then
                echo -n \"
                after_dq=''
            else
                after_dq=1
            fi
        else
            if [ -n "$after_dq" ]; then
                after_dq=''
                if [ -n "$in_dq" ]; then
                    in_dq=''
                else
                    in_dq=1
                fi
            fi

            if [ -z "$in_dq" -a \( "$c" = , -o "$c" = $'\n' \) ]; then
                in_req=''
                echo
            else
                echo -n "$c"
            fi
        fi
    done
}

Index

Feed

Other

Link

Pathtraq

loading...