Skip to content

v0.239.0

Choose a tag to compare

@github-actions github-actions released this 08 Sep 17:26
· 14 commits to main since this release

kanpic v0.239.0

v0.239.0

세미콜론으로 가른 CSV 를 IMPORTDATA 도 표로 읽습니다

소수점을 쉼표로 적는 로케일에서 엑셀은 CSV 를 세미콜론 으로 가릅니다.
쉼표 자리는 이미 소수점이 가져갔기 때문입니다. 독일어·프랑스어 환경에서
"CSV(쉼표로 분리)" 로 내보낸 파일이 정작 이름;금액;메모 인 까닭입니다.

kanpic 에 그런 파일이 들어오는 문은 둘입니다.

  • 올리기 — 파일을 끌어다 놓는 가져오기
  • 부르기=IMPORTDATA("https://…/price.csv")

같은 파일인데 두 문이 서로 다른 표를 내주었습니다.

올리기는 첫 줄에서 ,·;·\t 를 세어 가장 많은 것으로 갈랐으므로 제대로
읽었습니다. 부르기는 쉼표를 기본으로 두고, 첫 줄에 탭이 있고 쉼표가 없을
때만 탭으로 보았습니다. 세미콜론은 아예 후보가 아니었습니다. 그래서

품목;단가;비고
연필;1200;

한 열짜리 글자 덩어리 로 들어앉았습니다. 연필;1200; 이 통째로 A 열의
한 칸입니다. 수가 하나도 없으니 =SUM(A:A) 은 0 을 내놓고, 열을 가리키는
수식은 모두 빈손으로 돌아옵니다. 화면에 오류는 뜨지 않습니다 — 표가 들어왔고,
다만 열이 하나일 뿐이니까요. 파일을 내려받아 올려 보면 멀쩡하니, 무엇이
다른지 알아내기도 어렵습니다.

이제 열을 가르는 규칙은 internal/delimited 한 곳에 있고 두 문이 함께
씁니다. 어느 문으로 들어오든 같은 파일은 같은 표가 됩니다.

따옴표 안의 세미콜론은 글자입니다

규칙을 한데 모으면서 올리기 쪽에 있던 흠도 함께 고쳤습니다. 세는 자가
따옴표 안까지 셌습니다.

id,"가;나;다;라"
1,42

첫 줄의 세미콜론은 셋, 쉼표는 하나입니다. 그래서 쉼표로 가른 파일 전체가
세미콜론으로 갈렸습니다.
헤더의 한 칸이 세미콜론을 여럿 담았다는 것이
까닭의 전부입니다. 이제 따옴표 안은 세지 않으므로 이 파일은 두 열입니다.

  • 짝이 맞지 않는 따옴표가 있으면 나머지 줄이 따옴표 안으로 보여 아무것도
    세지 않게 되고, 그때는 쉼표로 돌아옵니다.
  • 수가 같으면 쉼표가 이깁니다(a,b;c 는 쉼표).
  • 첫 줄만 봅니다. 둘째 줄의 내용이 파일을 가르는 방식을 바꾸지 않습니다.

큰 파일을 올릴 때 첫 줄을 보려고 이십 메가바이트를 통째로 글자로 옮기던
자리도 함께 줄였습니다. 줄 하나만 잘라 넘깁니다.

확인

  • internal/delimited/delimiter_test.go
    • TestDelimiterFollowsTheFirstLine — 쉼표·세미콜론·탭, 가르는 것이 없는
      줄, 따옴표 안의 세미콜론과 쉼표, 짝이 맞지 않는 따옴표, 줄 끝의 CR 까지
      열한 가지를 갈라 봅니다
  • internal/external/fetcher_test.go
    • TestImportDataReadsWhicheverSeparatorCutsTheFile — 증상 그대로,
      세미콜론으로 가른 표가 3열로 들어오고 1200 이 수인지, 따옴표 안의
      쉼표가 칸을 가르지 않는지 봅니다. 고치기 전에는 깨지는 시험입니다
  • internal/importexport/service_test.go
    • TestQuotedSeparatorsDoNotDecideHowTheFileIsCut — 헤더의 따옴표 안
      세미콜론이 파일 전체를 가르지 못한다는 것을 못 박습니다

서버 안쪽에서 파일을 읽는 규칙만 바뀌었습니다. 화면과 저장한 문서는 그대로이고
따로 하실 일은 없습니다.

오프라인 설치

이 릴리즈는 웹 자산과 서버 바이너리를 포함한 Docker 이미지 아카이브로 제공됩니다.

sha256sum -c kanpic-v0.239.0.tar.gz.sha256
gzip -dc kanpic-v0.239.0.tar.gz | docker load
docker run --rm -p 8080:8080 \
  -e POSTGRES_DSN='postgres://kanpic:password@postgres.internal:5432/kanpic?sslmode=require' \
  kanpic:v0.239.0
  • 필수 런타임 환경 변수: POSTGRES_DSN
  • Redis 및 외부 인터넷 연결: 불필요
  • 관리자 초기 로그인을 보호하려면 BOOTSTRAP_ADMIN_IDBOOTSTRAP_ADMIN_PASSWORD를 함께 지정합니다.
  • 무결성 검증 파일: kanpic-v0.239.0.tar.gz.sha256