CSVKit을 사용하여 열 길이를 자르는 방법은 무엇입니까?
정의는 다음과 같습니다:
- 열 1: 길이 제한 없음
- 2열 : <2자 이내>
이스케이프된(인용) 열과 새 행을 올바르게 처리해야 합니다.
예를 들어:
First Header,Second Header
foo,
foo,b
foo,bar
foo,"bar"
foo,"""bar"
foo,"
bar"
되어야 한다
First Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"
답변1
~처럼r_31415의 답변하지만 수정하려는 필드 이외의 다른 필드 이름을 지정하거나 필드 순서를 기억할 필요는 없습니다.엠마 루오의 답변이와 관련하여):
csvsql --query 'UPDATE stdin SET "Second Header" = substr("Second Header",1,2); SELECT * FROM stdin' <file
JSON 인식 도구를 연결하여 데이터에 대해 필요한 변환을 수행할 수 있는 약간 더 유연한 접근 방식입니다.
- csvkit을 사용하여
csvjson
CSV 데이터의 JSON 배열을 만듭니다. jq
JSON 데이터를 읽고Second Header
값을 두 문자로 자르는 데 사용됩니다 .- csvkit을 사용하여
in2csv
JSON을 읽고 CSV를 만듭니다.
csvjson file | jq 'map(."Second Header" |= .[:2])' | in2csv -f json
문제의 CSV 데이터를 고려하면 의 출력은 csvjson
다음과 같습니다.
[
{
"First Header": "foo",
"Second Header": null
},
{
"First Header": "foo",
"Second Header": "b"
},
{
"First Header": "foo",
"Second Header": "bar"
},
{
"First Header": "foo",
"Second Header": "bar"
},
{
"First Header": "foo",
"Second Header": "\"bar"
},
{
"First Header": "foo",
"Second Header": "\nbar"
}
]
의 출력은 jq
다음과 같습니다.
[
{
"First Header": "foo",
"Second Header": null
},
{
"First Header": "foo",
"Second Header": "b"
},
{
"First Header": "foo",
"Second Header": "ba"
},
{
"First Header": "foo",
"Second Header": "ba"
},
{
"First Header": "foo",
"Second Header": "\"b"
},
{
"First Header": "foo",
"Second Header": "\nb"
}
]
최종 출력:
First Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"
답변2
이것은 csvsql 솔루션입니다.
csvsql -d ',' --query 'SELECT "First Header" as "First Header",substr("Second Header",1,2) as "Second Header" FROM data' data.txt
First Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"
답변3
표시되기 전까지는 CSVKit으로 직접 구현하는 것이 가능하다고 생각하지 않았습니다.그렇지 않으면. 하지만 합격이 가능한 것으로 알고 있습니다.밀러:
mlr --csv put '${Second Header} = substr(${Second Header},0,1)' file.csv
산출
First Header,Second Header
foo,
foo,
foo,ba
foo,ba
foo,"""b"
foo,"
b"
(Miller 버전 6 이상을 사용하는 경우 더 좋고 선호되는 대안이 있습니다 substr
. 여기서는 테스트할 수 없으므로 포함하지 않겠습니다.)