csv 파일 포맷 변경관련 문의 드립니다.

wongidos의 이미지

안녕하세요.
아래와 같은 csv파일의 포맷이 있는데 원본은 아래와 같습니다.
리눅스 상에서 [수정 csv]와 같이 변경할 수 있는 방법이 있는지 문의 드립니다.
찾아보니 sed라는 명령어를 사용하면 된다는데 잘 몰라서 문의 드립니다.

원본 CSV
"SEQ","ID","DESC","YYYYMMDD"
"1","A","JAN","20180101"
"2","B","FEB","20180102"
"3","C","MAR
APR
MAY
JUN
","20180103"
"4","D","JUL","20180104"

3번째 DESC가 엔터값이 들어가 있습니다.
파싱이 안되어서 아래와 같이 변경하고 싶습니다.

수정 CSV
"SEQ","ID","DESC","YYYYMMDD"
"1","A","JAN","20180101"
"2","B","FEB","20180102"
"3","C","MAR\n\rAPR\n\rMAY\n\rJUN","20180103"
"4","D","JUL","20180104"
MAR\n\rAPR\n\rMAY\n\rJUN 와 같이 \n\r또는 엔터값을 의미하는 뭔가를 넣어 한줄로 만들고 싶습니다.

부슬부슬 내리는 비에 막걸리가 생각나는 날이네요.
도움 주셔서 감사합니다.

ymir의 이미지

맨 마지막 필드가 반드시 큰 따옴표(") 로 감싸여 있다고 가정하면..

$ cat in.csv
"SEQ","ID","DESC","YYYYMMDD"
"1","A","JAN","20180101"
"2","B","FEB","20180102"
"3","C","MAR
APR
MAY
JUN
","20180103"
"4","D","JUL","20180104"
$ cat in.csv | sed -z 's/\([^"]\)\n/\1\\n\\r/g'
"SEQ","ID","DESC","YYYYMMDD"
"1","A","JAN","20180101"
"2","B","FEB","20180102"
"3","C","MAR\n\rAPR\n\rMAY\n\rJUN\n\r","20180103"
"4","D","JUL","20180104"

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

wongidos의 이미지

대단하십니다.
답변주신 내용을 참고로 고민해보겠습니다.

추가 질문 한가지만 더 드리자면
혹시 위 sed문을 사용하면 속도가 많이 느려지나요?
현재 상황은 csv파일 150개 정도를 파싱해야 하는데
150개 파일 전체에 위 로직을 반영하면 속도가 많이 저하될까 우려스러워서 문의 드립니다.

좋은 하루 되세요^^

ymir의 이미지

'속도' 가 '많이' '느려진다' 를 구체적으로 정의해 주시면..
어느 정도는 설명 드릴 수도 있을 것 같네요. 특히 '많이' 부분이 짐작하기 어렵군요.
누구의 속도를 말하는지, 파일을 처리하는 데 걸리는 시간이 어느 정도 되야 안심해도 되는 상황인지..

간단히 소요 시간을 측정해 보면 판단하기 쉽겠죠.
다음과 같이 time 명령으로, 명령어 수행에 걸리는 시간을 측정해 볼 수 있습니다.

$ time for file in *.csv; do cat $file | sed -z 's/\([^"]\)\n/\1\\n\\r/g' > ${file/.csv/.out}; done

주의 해야 할 점은, 위 명령을 두 번째 실행할 때부터는 첫 번째 보다 시간이 적게 걸릴겁니다.
파일을 한 번 읽으면서 파일을 캐시에 넣고, 두 번째 부터는 캐시에서 접근하기 때문인데..
그 점을 감안해서 측정해 보시면 되겠습니다.
캐시 날리는 건 linux drop caches 로 검색해 보세요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

wongidos의 이미지

안녕하세요.
답변주신 cat in.csv | sed -z 's/\([^"]\)\n/\1\\n\\r/g'는 위와 같이 간단히 테스트 포맷을 만들어 해보면 정상적으로 되는데
업체에서 준 파일로 테스트해보면

"SEQ","ID","DESC","YYYYMMDD"\n\r"1","A","JAN","20180101"\n\r"2","B","FEB","20180102"\n\r"3","C","MAR\n\rAPR\n\rMAY\n\rJUN\n\r","20180103"\n\r"4","D","JUL","20180104"
이렇게 한줄로 되어 버립니다.
즉, 바뀌지 말아야할 부분인 라인의 끝에 무조건 \n\r로 바뀌어 버리는데
유닉스에서 csv파일을 만들어서 그런가요?
샘플 파일 첨부드립니다.

바쁜시간 내주셔서 감사합니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon stgshrarlmst_02MAY2018_1310.zip61 KB
karkayan의 이미지

윈도에서 생성된 파일인지 줄바꿈이 CRLF로 되어있네요.
cat in.csv | sed -z 's/\([^"]\)\r\n/\1\\n\\r/g'
를 사용하시거나,
dos2unix 등의 툴을 써서 CRLF를 LF로 바꾸면 됩니다.

사족이지만 보통 줄바꿈은 CRLF나 LF를 사용하니까 \n\r이 아니라 \r\n으로 바꾸는 게 더 좋을것 같습니다.

세벌의 이미지

\r\n 인가요? \n\r 인가요? r과 n의 순서 문제는 혹시 아닌가요?

wongidos의 이미지


마지막에 음표가 들어가 있네요.ㅎㅎ
그부분이 \n\r로 치환되면서 한줄로 바뀌는 것 같습니다.
음표가 안보이게 숨어 있는것 같은데 이 경우에는 어떻게 해야 하는지요?

도움 주셔서 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.