Skip to content

About

윈도우11용 고성능 CSV 파일 뷰어

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Repository files navigation

Nanum CSV Viewer

대용량 CSV 파일을 빠르게 열고 부드럽게 탐색하는 Windows 데스크톱 뷰어입니다. 1 GB가 넘는 CSV도 첫 페이지가 즉시 표시되며, 한글 인코딩(EUC-KR / CP949 / UTF-8)을 정확히 처리합니다.

.NET 10 · Windows Forms · 단일 실행 파일(.exe) 배포 지원

v3.4.3 — 분석 메모리 방식 선택

  • 설정 ▸ 파일과 데이터 ▸ 분석 메모리 방식 — 기존 자동(전체 물리 RAM의 50%, 최소 512 MB) / 직접 지정(분석 상한)에 여유 RAM 확보를 추가했습니다. 기본값과 기존 설정 파일의 방식은 그대로 유지합니다.
  • 여유 RAM 확보 — 남겨 둘 RAM(기본 4 GB, 최소 0.5 GB)을 지정하면, 분석이 예산을 얻을 때의 가용 RAM − 남겨 둘 RAM을 사용합니다(가용 10 GB, 여유 4 GB → 분석 예산 6 GB). 최소 분석 예산을 강제로 부여하지 않으며, 여유가 없거나 가용 RAM을 읽지 못하면 부분 결과 없이 중단합니다.
  • 값 저장과 안내 — 직접 지정 상한과 여유 값은 각각 기억합니다(AnalysisMemoryAuto, AnalysisMemoryManualGb, AnalysisMemoryReserve, AnalysisMemoryReserveGb). 총 RAM·가용 RAM·현재 분석 예산과 경고를 표시하며, 예산 초과 안내에서 설정을 열어 상한을 올리거나 여유 값을 줄일 수 있습니다. 여유 부족으로 피벗을 중단해도 이전 결과는 유지하며, 저장된 부스팅 모형의 읽기·예측에는 학습 예산을 요구하지 않습니다.
  • 범위 — 기본 분석·차트·그룹 집계·중복·카이제곱·피벗·품질 참조 집합·고급 통계의 분석별 예상 메모리 검사입니다. 프로세스 전체 강제 제한이나 다른 프로그램·동시 분석의 사용량 변화에도 여유 RAM이 유지된다는 보장은 아닙니다. DuckDB 작업 공간 질의의 상한은 별개입니다.
  • 검증 — 관련 테스트 313개 통과. 실제 한영 설정 창에서 방식 전환·적용·재열기·기본값 복원, 여유 부족 시 분석 중단과 피벗 이전 결과 유지를 확인했습니다.

v3.4.2 — 분석 메모리 예산 개선

  • 기본 분석은 필요한 컬럼만 복사합니다 — 기술통계·빈도분석·수치 분포·날짜 히스토그램·중복 찾기·그룹별 집계·상관·t검정·분산분석·카이제곱·정규성 검정이 모든 컬럼을 메모리에 복사해 61컬럼 × 15만 행(69 MB) 파일에서 전체 분석 데이터가 메모리 예산을 초과했습니다로 실패하던 문제를 고쳤습니다. 이제 각 분석이 쓰는 컬럼(1~3개, 중복 찾기는 키 컬럼)의 셀만 보관하고 나머지 셀은 보관하지 않으며, 메모리 추정도 그 셀만 셉니다. 결과는 이전과 동일합니다(분석별로 전체 복사본과 비교하는 테스트).
  • 분석 메모리 예산은 기본 자동 = 이 PC 물리 메모리의 50% — 고정 128 MB(그 뒤 GC 가용 메모리의 25%, 최대 4 GB) 대신, 자동 모드는 이 PC 물리 메모리(설치된 RAM)의 50%, 최소 512 MB, 상한 없음입니다(16 GB PC → 8 GB, 64 GB PC → 32 GB). 기본 분석·차트 빌더·그룹별 집계·중복 찾기·카이제곱뿐 아니라 피벗(예전 256 MB 고정), 품질 검사의 참조 무결성·적합성 참조 키 집합(예전 256 MB 고정), 고급 통계의 설계행렬·특성행렬·그래디언트 부스팅·혼합모형·생존분석(예전 1 GB 고정)이 모두 같은 예산을 씁니다. DuckDB 작업 공간 질의의 메모리 상한은 그대로입니다.
  • 설정 ▸ 파일과 데이터 ▸ 분석 메모리 상한 — 자동 / 직접 지정과 GB 값을 고릅니다. 직접 지정은 0.5 GB부터 이 PC 물리 메모리까지 정할 수 있고(넘는 값은 물리 메모리로 제한), 화면에 이 PC 메모리: X GB, 현재 사용 가능: Y GB를 보여 줍니다. 값이 현재 사용 가능한 메모리보다 크면 디스크 페이징이나 앱 중단 가능성을 경고하지만 저장은 할 수 있습니다. 값은 설정 파일(AnalysisMemoryAuto, AnalysisMemoryManualGb)에 저장됩니다.
  • 예산 초과 안내에서 바로 설정으로 — 예산을 넘으면 예전처럼 일부 행만 분석한 결과를 만들지 않고, 설정에서 상한을 올릴 수 있습니다 문구와 함께 [예]를 누르면 설정의 파일과 데이터 쪽을 여는 안내 창을 보여 줍니다(기본 분석·고급 통계·피벗·참조 무결성·적합성 프로파일; 차트는 설정 열기 링크).

v3.4.1 — 작업 공간 탐색기 기본 표시, 패널 헤더·구분선 통일

  • 작업 공간 탐색기가 기본으로 보입니다 — 시작 패널 기본값이 탐색기 + AI 켜짐 / 행 상세·패싯·검사 결과 꺼짐 / 셀 줄 켜짐이 되었습니다. 설정에 저장된 시작 패널이 예전 기본값과 정확히 같을 때만(AI·셀 줄만 켜짐) 업데이트 뒤 한 번 탐색기를 켭니다(설정 파일의 PanelDefaultsVersion이 처리 여부를 기록하므로 이후 설정에서 탐색기를 끄면 그대로 유지됩니다). 직접 고른 배치는 바뀌지 않고, 작업 공간 파일의 배치와 '마지막 상태 기억'이 여전히 앞섭니다. 좁은 창에서 탐색기를 자동으로 접지는 않습니다.
  • 패널 머리글 통일 — 탐색기의 도구 띠, 표 위의 셀 주소·값 줄, 행 상세 머리글, AI 채팅의 상단 바가 같은 규격(Ui/PanelChrome.cs)을 씁니다: 높이 30(논리 px, 아래 1px 경계선 포함), 배경은 팔레트의 도구 띠 색, 글자 9pt(웹은 12px)·보통 굵기, 아래 경계선은 팔레트 Border 색 1px. 채팅 페이지에는 기존 테마 메시지의 CSS 변수(--chromeH/Bg/Fg/Border/Fs/Fw)로 전달하므로 밝은/어두운 테마 모두 같은 값입니다.
  • 분할선 통일 — 탐색기|표, 셀 줄|표, 표|행 상세, 본문|AI 패널의 분할선이 모두 팔레트 Border 색 1px 선이고, 끌 수 있는 면은 5px(논리 px)로 유지됩니다(선 둘레는 창 배경색). 행 상세 머리글의 이중 테두리도 없앴습니다.
  • 셀 주소 상자 — 테두리 없이 글자만 보이다가, 포커스를 받아 입력하는 동안에만 강조색 밑줄이 나타나고 벗어나면 사라집니다. 입력 동작(Enter 이동·Esc 복원 등)은 그대로이고 값 줄은 입력 상자 모양을 유지합니다.

v3.4.0 — AI 환경 설정 안정화(WebView2·DPI·omp 설치·설정 도우미)

처음 설치한 PC나 회사 PC에서 AI 채팅이 "빈 화면·오류"로 끝나지 않도록, 원인을 가려내고 앱 안에서 고칠 수 있게 했습니다.

  • AI 환경 설정 도우미(도구 ▸ AI 환경 설정 도우미…, 설정 ▸ AI 에이전트의 같은 이름 버튼) — ① WebView2 ② omp ③ 로그인 ④ 연결 시험, 네 단계를 차례로 검사해 단계마다 상태(정상·주의·실패)와 원인, 해결 단추를 보여 줍니다. AI 패널이 시작하지 못했을 때(채팅 화면 시작 실패·omp 못 찾음) 앱 버전마다 한 번 자동으로 열리고, '다시 표시하지 않기'를 켜면 자동으로는 열지 않습니다(메뉴·설정에서는 언제든 엽니다). 연결 시험은 omp를 짧은 RPC 프로세스로 띄워 핸드셰이크·로그인 제공자·모델 목록만 확인하며 모델에는 어떤 메시지도 보내지 않습니다.
  • omp 찾기 — 순서는 설정의 omp 경로 → PATH의 omp.exe → omp.cmd/omp.bat → %LOCALAPPDATA%\omp\omp.exe입니다(PowerShell 래퍼 omp.ps1은 표준 입출력 RPC에 쓸 수 없어 미지원으로 표시). PATH는 레지스트리(Machine·User)에서 다시 읽으므로 앱을 켠 뒤에 설치·PATH 변경을 해도 [다시 시도]로 반영됩니다. 최소 버전은 18.4.4이며, 못 찾으면 확인한 위치를 모두 나열합니다. 릴리스 원본 이름 그대로인 omp-windows-x64.exe/omp-windows-arm64.exe(다운로드 폴더·PATH)와 실행 중인 omp는 자동으로 쓰지 않고 '이 파일 설치(복사)' 후보로만 제안합니다.
  • omp 설치·내려받기 — 채팅 오류 알림과 도우미에 [찾아보기…] · [이 파일 설치] · [다운로드하여 설치] · [다시 시도]가 있고, 선택 사항으로 '사용자 PATH에도 추가'(기본 꺼짐)를 고를 수 있습니다. 내려받기는 GitHub(can1357/oh-my-pi)의 최신 정식 릴리스(초안·시험판 제외)에서 이 PC 아키텍처의 omp-windows-<x64|arm64>.exe를 HTTPS로 받아, 릴리스가 공개한 SHA-256과 대조한 뒤 --version(≥ 18.4.4)을 확인하고서야 %LOCALAPPDATA%\omp\omp.exe를 원자적으로 교체합니다(실패하면 기존 설치는 그대로). 릴리스에 SHA-256이 없으면 설치를 거부하고 직접 받아 쓰도록 안내합니다. 시스템(회사) 프록시를 쓰며 앱은 아무 정보도 보내지 않습니다. omp는 MIT 라이선스이고 Authenticode 서명은 되어 있지 않아 Windows가 처음 실행할 때 경고할 수 있습니다(복사 설치는 인터넷에서 받았다는 차단 표시를 지웁니다).
  • WebView2 오류를 원인별로 안내 — 런타임 없음(설치 페이지 링크) / 0x8007139F(호환성 설정 또는 데이터 폴더 충돌) / 접근 거부(데이터 폴더 권한) / 런타임 파일 손상·구조 불일치 / 그 밖. 채팅 화면 [다시 시도]는 컨트롤을 새로 만들어 다시 초기화합니다. 초기화에 실패하면 %LOCALAPPDATA%\NanumCsvViewer\agent\webview2-init.log에 기록이 쌓이고, 지원용으로 환경 변수 NANUMCSV_WEBVIEW2_LOG=1을 주고 시작하면 WebView2 브라우저 로그를 agent\webview2-browser.log에 남깁니다(앱의 모든 WebView2에 적용).
  • DPI 모드를 Per-Monitor V2로 — WebView2(msedgewebview2.exe)와 같은 모드입니다. 이전의 System aware에서는 msedgewebview2.exe에 HIGHDPIAWARE 호환성 레이어가 걸린 PC에서 채팅이 0x8007139F로 시작하지 못했습니다. 그래도 DPIUNAWARE·GDIDPISCALING 같은 레이어는 여전히 초기화를 막으므로, 현재 사용자(HKCU)의 msedgewebview2.exe·NanumCsvViewer.exe 호환성 항목은 오류 화면·도우미의 **[설정 해제]**로 지울 수 있습니다. 지우기 전에 HKCU Layers 전체를 %LOCALAPPDATA%\NanumCsvViewer\backup\appcompat-<날짜>.reg로 백업하며(더블클릭 병합으로 복원), DPI 외의 호환성 설정(예: WINXPSP3)은 남깁니다. HKLM 항목은 관리자 권한이 필요해 안내만 합니다.
  • 로그인 — 도우미 3단계에서 제공자를 골라 [로그인]을 누르면 omp RPC로 OAuth를 진행하고 인증 주소를 기본 브라우저로 엽니다(주소 복사 단추 있음). API 키처럼 여기서 입력할 수 없는 비밀 값이 필요한 제공자는 터미널(omp login)이나 제공자 환경 변수(예: ANTHROPIC_API_KEY)로 안내합니다. 모델 목록이 비어 있으면 채팅 알림에 [로그인…] 단추가 나오고 누르면 도우미의 로그인 단계가 열립니다.
  • 도움말 ▸ AI 환경 진단 정보 복사 — 앱·OS·DPI, WebView2 상태와 초기화 로그 끝부분, omp 탐색 결과, Python 환경, 에이전트 설정, rpc.log 끝부분(프레임 종류만, 메시지 내용 없음)을 한 번에 클립보드에 복사하고 파일로 저장할지 묻습니다. 사용자 이름·사용자 폴더 경로와 API 키·토큰 같은 비밀 값은 가리며(패턴 기반이라 모르는 형식은 못 가릴 수 있으니 붙여 넣기 전에 훑어보세요), 데이터 내용(셀 값·질문·답변)은 넣지 않습니다.

v3.3.5 — 설정 창 오류 수정, 패싯 패널 버튼

  • 설정 열기 오류 수정 — 작업 공간 파일(.ncvws)을 연 상태에서 ⚙ 설정을 누르면 "value ('0') must be less than '0'. (Parameter 'value')" 예외 대화 상자가 뜨던 문제를 고쳤습니다. AI 쪽의 "설정 적용 대상" 콤보 항목을 채우는 순간 올라오는 선택 변경 이벤트가 아직 비어 있는 다른 콤보에 선택을 지정하던 것이 원인이었습니다. 이제 번역·항목 채우기 중의 선택 변경은 사용자 조작으로 보지 않고, 모든 설정 쪽의 콤보 선택은 항목이 있을 때만 범위 안으로 지정합니다.
  • 도구 모음에 패싯 패널 토글 — 오른쪽 패널 그룹이 [탐색기][패싯][행 상세][AI] | [설정]이 되었습니다. 패싯 단추(툴팁 패싯 패널 (F6))는 보기 ▸ 패싯 패널·F6·작업 공간 복원과 눌림 상태가 같이 움직입니다.

v3.3.4 — 새 작업 공간, 채팅 '+'로 파일 추가, 시트 탭 위치

  • 파일 ▸ 새 작업 공간…(Ctrl+Shift+N) — 저장하지 않은 변경이 있으면 기존 저장 확인(저장/저장 안 함/취소)을 먼저 띄우고(취소하면 아무것도 바뀌지 않음), 대화 상자에서 위치(폴더 선택, 기본은 최근 작업 공간의 폴더 또는 문서)와 이름을 받습니다. 만들어질 .ncvws 경로와 분석 폴더(<위치>\<이름>_분석결과)를 바로 미리 보여 주고, 이름·경로를 검사하며 같은 이름의 파일이 있으면 덮어쓸지 묻습니다. 지금 열린 파일 포함(기본 꺼짐)을 켜면 열린 파일·시트 탭을 그대로 두고 원본으로 등록하고(뷰·질의 결과 탭은 닫음), 끄면 작업 공간 닫기와 똑같이 모든 탭·원본·뷰를 닫습니다(저장 안 한 셀 편집은 기존 확인). 새 .ncvws는 바로 저장되어 현재 작업 공간이 되고, 최근 목록·상태 줄이 갱신되며, AI 에이전트는 새 분석 폴더와 새 대화로 바뀌고(omp는 작업 공간 전환과 동일), 패널은 앱 시작 배치로 돌아갑니다. 메뉴 순서: 새 작업 공간… · 작업 공간 열기… · 최근 작업 공간 · 작업 공간 저장 · 다른 이름으로 저장 · 작업 공간 닫기.
  • 시트 탭 띠 위치 수정 — 시트가 여러 개인 통합 문서에서 하단 시트 탭 띠가 창 폭 전체로 펼쳐져 왼쪽 작업 공간 탐색기와 오른쪽 AI 패널 밑까지 차지하던 문제를 고쳤습니다. 이제 띠는 그리드 바로 아래에만 놓이고 행 상세 패널·탐색기·AI 패널(패싯 패널 밑도 포함) 밑으로 가지 않으며, 패널을 켜고 끄거나 크기를 바꾸고 탭을 전환해도 그리드를 따라갑니다. 같은 이유로 검사 결과 패널도 창 전체가 아니라 그리드 영역(그리드+패싯 폭)의 맨 아래로 옮겼고, 패싯 패널은 그리드 오른쪽에 그대로 있습니다.
  • AI 채팅 입력창의 + — 파일·폴더를 작업 공간에 바로 추가 — 입력창 왼쪽 아래의 + 메뉴에서 파일 추가…(여러 개 선택)·**폴더 추가…**를 고르면 기본 파일/폴더 대화 상자가 열리고, 채팅 창에 파일이나 폴더를 끌어다 놓아도 같습니다(WebView2 끌어놓기를 켜고 페이지가 넘긴 파일 객체에서 호스트가 경로를 읽습니다. 페이지가 글로 보낸 경로는 믿지 않음). 고른 파일은 CSV·TSV·TXT·엑셀(xlsx/xlsm/xls)·SAS·SPSS·SQLite(db/sqlite/sqlite3)만 작업 공간 원본으로 올리고(AddSourcesAsync, 탭은 열지 않으며 작업 공간 파일이 없어도, 이미 올린 파일이어도 됩니다 — 이미 올린 파일은 그대로 두고 칩만 다시 만듭니다), 폴더는 바로 아래의 데이터 파일만(하위 폴더 제외) 올리고 10개를 넘으면 N개 파일을 추가할까요?로 먼저 묻습니다. PDF·그림 등 지원하지 않는 파일은 올리지 않고 채팅에 지원하지 않는 형식: 이름… 알림을 남기며, 질의 엔진을 쓸 수 없으면 그 이유를 채팅에 알립니다. 올린 파일은 입력창 위에 📎 orders.csv 칩(×로 그 메시지에서만 뺌, 툴팁에 작업 공간 표 이름 — DB 파일은 표 이름 전부)으로 보이고, 다음 메시지를 보낼 때 omp에 [Attached workspace tables: orders (orders.csv), …] Use ws.* tools to inspect them. 한 줄이 글 앞에 붙습니다(파일 내용은 없고 파일·표 이름뿐 — 데이터 정책은 그대로, 슬래시·! 명령에는 붙지 않음, 표가 40개를 넘으면 +N more). 말풍선과 다시 불러온 대화·세션 목록에는 이 줄 대신 칩과 사용자가 쓴 글만 보이고, 보낸 뒤 칩은 지워집니다. 위쪽 +(새 세션) 버튼의 툴팁은 새 대화/New chat으로 바꿨습니다(동작은 그대로).

v3.3.3 — 작업 공간 탐색기 클릭 = 탭 선택

  • 탐색기 노드를 한 번 클릭하면 탭 띠를 누른 것과 같습니다. 열린 탭이 있는 노드(파일·뷰·질의 결과·올리지 않은 파일)는 그 탭으로 바로 전환하고, 아직 열지 않은 표는 열고, 안 계산한 뷰는 계산합니다(진행 표시·취소 그대로). 통합 문서(엑셀·SAS·SPSS·SQLite)의 시트 노드는 그 워크북 탭으로 전환해 해당 시트를 보여 주고(탭을 닫았으면 다시 열고), 컬럼 노드는 그 표·뷰의 탭을 활성화한 뒤 격자에서 그 컬럼의 맨 위 보이는 행 셀을 현재 셀로 고르고 가로로도 보이게 스크롤합니다(숨긴 컬럼은 숨김을 풀지 않고 상태 줄로 알립니다). 이미 활성인 탭의 노드를 누르면 아무 일도 없고, 그룹은 지금처럼 더블클릭·Enter로 접고 펼치며, DB 원본 노드는 선택만 됩니다.
  • 방향키는 선택만 옮기고, Enter가 여는 동작은 그대로입니다. 오른쪽 클릭은 메뉴만, 코드로 고른 선택(아래 동기화·트리 갱신)도 아무것도 열지 않습니다. 더블클릭은 한 번 클릭과 같아서 표를 두 번 열지 않습니다.
  • 탭 → 트리 동기화: 활성 탭이나 워크북의 시트가 바뀌면(탭 띠·시트 버튼·단축키·에이전트 어느 쪽이든) 맞는 노드(표·시트·뷰·질의 결과·올리지 않은 탭)를 클릭 동작 없이 골라 보이게 펼칩니다.
  • 빠른 연속 클릭: 새 클릭은 아직 끝나지 않은 앞 클릭을 대신합니다. 취소할 수 있는 뷰 계산은 취소하고, 취소할 수 없는 일(파일 열기·가져오기)의 결과는 활성화하지 않고 버립니다.

v3.3.2 — 모델 선택기에 '최근 사용'

  • 채팅의 모델 버튼 메뉴 맨 위에 '최근 사용' 그룹이 생겼습니다. omp가 직접 적어 둔 모델별 마지막 사용 시각(~/.omp/agent/agent.db의 model_usage)을 읽기 전용(쓰기·체크포인트 없음, omp가 실행 중이어도 안전)으로 읽어, 지금 고를 수 있는 모델 중 최근 8개를 최근 순으로 보여 줍니다. 그 아래는 지금처럼 제공자별 전체 목록입니다. 최근 모델도 제공자 그룹에 그대로 남아(제공자별로 훑을 때 빠지는 모델이 없도록) 검색은 두 곳 모두에 적용되고, 현재 모델은 계속 선택·굵게 표시됩니다. 모델을 바꾸면 곧바로 갱신됩니다.
  • 읽을 수 없으면 전체 목록으로 되돌아갑니다. 기록 파일이 아직 없거나 잠깐 잠겨 있으면 조용히 전체 목록만 보이고, omp 내부 형식이 바뀌었거나(표·열·값 형식 불일치) 읽기 오류가 나면 채팅에 경고 알림("omp 내부 형식이 바뀌어 최근 사용 모델을 표시할 수 없습니다 … 앱을 업데이트하세요")을 omp 버전마다 한 번 띄우고 rpc.log에 남깁니다. 설정 ▸ AI 에이전트 맨 아래에 현재 상태 한 줄("최근 사용 모델: omp 기록 사용 중 / 읽을 수 없음 (이유)")이 보입니다.

v3.3.1 — omp 미리 시작

  • 모델·생각·승인 선택이 첫 메시지 전에 켜집니다 — 시작 직후나 작업 공간(.ncvws)을 연 뒤에도 첫 메시지를 보낼 때까지 선택이 꺼져 있던 문제를 고쳤습니다. 이제 AI 패널이 보이는 동안 앱이 한가해지고 약 1.5초 뒤 omp가 백그라운드에서 시작되어 모델 목록이 먼저 채워집니다(작업 공간 열기·파일 열기·필터/정렬 같은 작업이 끝난 뒤에 시작하며 대용량 파일의 백그라운드 인덱싱은 기다리지 않습니다). 패널이 숨겨져 있으면 이전처럼 패널을 열거나 첫 메시지를 보낼 때 시작합니다.
  • 로컬 Python 분석이 켜져 있으면 분석 폴더가 정해지는 첫 파일(또는 작업 공간)을 연 뒤에 시작해 불필요한 재시작이 없습니다. omp가 없거나 시작에 실패해도 대화상자 없이 채팅 알림으로만 알립니다.
  • 아래 v3.2.0의 "omp 지연 시작" 설명은 패널이 숨겨져 있을 때(그리고 패널이 보이는 채 앱이 한가해지기 전)의 동작입니다.

v3.3.0 — 분석 스킬 팩·관리형 Python 분석 환경

  • 분석 스킬 팩 20개 — 임상 연구 7(PK/PD·NCA, 임상 보고서, 연구용 의사결정 지원 문서화, 실험 설계, 검정력, scikit-survival, 분석법 검증) · 일반 통계 9(탐색적 분석, 통계 분석, statsmodels, aeon 시계열, 과학 시각화, matplotlib, seaborn, polars, dask) · 기계학습 3(scikit-learn, SHAP, UMAP) · 앱 전용 1(nanum-python-analysis). 19개는 K-Dense-AI/scientific-agent-skills v2.72.0(MIT)을 원본 그대로 가져온 것이고, 앱 전용 1개는 이 앱이 작성했습니다. 네트워크·GPU·업로드·환자 개별 판단이 필요한 26개는 검토 후 제외했습니다.
  • 로드 조건·토큰 비용 — 로컬 Python이 켜져 있고 마스터 스위치가 켜져 있을 때만 실립니다(Python이 꺼져 있으면 0 토큰). 설정 ▸ AI 에이전트 ▸ '분석 스킬'에서 전체·분류별·스킬별로 끌 수 있고, 스킬마다 토큰 추정과 총합(전체 켬 약 550 토큰)이 보입니다. 선택을 바꾸면 같은 대화로 에이전트가 다시 시작합니다. 앱 전용 스킬은 팩이 켜져 있는 한 항상 함께 로드됩니다.
  • 앱 도구 먼저 — 앱의 검증된 도구(csv.column_stats·csv.quality_scan·csv.run_analysis·ws.*)와 사용자가 메뉴에서 실행하는 분석(t검정·ANOVA·카이제곱·상관·정규성·반복측정·혼합모형·비모수·KM/Cox·ML·PCA/LDA)이 먼저입니다. Python 스킬은 앱에 없는 분석(PK/NCA, Bland-Altman, 검정력, 경쟁위험, 시계열, SHAP, 출판용 그림, 대용량 처리 등)이나 사용자가 Python을 명시했을 때만 쓰고, 어느 길을 썼는지 답에 밝힙니다.
  • 표기·재현성 — Python 결과에는 'Python 분석 (앱 검증 범위 밖)' 표기와 재현성 머리말(원본 파일·사용/제외 행 수·필터·패키지 버전·시드·시각·사용한 스킬), 가정·수렴·다중 검정에 대한 정직한 보고가 붙습니다. 연구·집계 분석용이며 환자 개별 진단·치료용이 아닙니다.
  • 관리형 Python 환경 — 설정 ▸ AI ▸ Python 환경에서 %LOCALAPPDATA%\NanumCsvViewer\python-analysis에 독립 venv(시스템 Python 변경 없음, system-site-packages 없음)를 만들고 묶음별로 설치·업데이트·제거합니다. 묶음은 core(pandas·numpy·scipy·statsmodels·matplotlib·seaborn·pyarrow·openpyxl) · stats(pingouin·scikit-posthocs·polars·dask·aeon) · clinical(lifelines·scikit-survival·pydoe) · ml(scikit-learn·xgboost·lightgbm·shap·imbalanced-learn·umap-learn)이며 모두 == 버전 고정, --only-binary=:all:(미리 빌드된 wheel만, 소스 빌드 없음)로 설치합니다. 설치 뒤 import를 확인하고 requirements.lock을 기록합니다. 64비트 Intel/AMD Windows의 Python 3.10~3.13만 지원하며 ARM64·32비트는 거절합니다. scikit-survival은 Python 3.13에서 의존 패키지에 wheel이 없어 3.13 미만에서만 설치됩니다(aeon은 3.10에서 1.3, 3.11 이상에서 1.6). 환경이 있으면 에이전트의 Python이 이 환경이 됩니다.
  • py.ensure_packages (승인 필요) — 에이전트는 스스로 pip install 하지 않고, 필요한 묶음을 이 도구로 요청합니다. 앱이 사용자 승인(승인 모드를 따름)을 받은 뒤 관리형 환경에만 설치합니다.
  • 도구 ▸ Python 분석 재현 패키지 내보내기… — 분석 스크립트·보고서·그림·requirements.lock·README를 폴더 또는 zip으로 묶습니다. 데이터는 기본으로 제외됩니다.
  • '요약만' + Python 경고 — '요약만' 데이터 정책에서도 Python 스크립트는 파일을 읽어 출력할 수 있으므로 설정에 경고가 표시됩니다. 출력 정책은 스킬·가이드의 지시(안내)일 뿐 하드 보장이 아닙니다.
  • 제3자 고지는 아래 '제한 사항' 뒤 '라이선스'를 참고하세요.

v3.2.0 — 메뉴·도구 모음·팝업 메뉴 재구성, 통합 설정, 패널 시작 상태

  • 10개 메뉴 — 파일 · 편집 · 보기 · 데이터 · 작업 공간 · 통계 · 시각화 · 품질 · 도구 · 도움말. 옛 위치 → 새 위치:
    • 옛 Edit의 찾기·필터·정렬 → 데이터(찾기 / 다음 찾기, 필터 적용 / 이 셀 값으로 필터 / 고급 필터 / 필터 해제, 오름·내림차순 정렬 / 정렬 해제, 셀로 이동). 편집은 되돌리기·다시 실행, 셀 편집, 시트 편집 모드, 복사·붙여넣기·지우기, 정규식 찾아 바꾸기, 행·컬럼 하위 메뉴를 담습니다.
    • 옛 View의 인코딩 → 데이터 ▸ 인코딩. 언어·테마 → 보기 ▸ 언어 / 테마(테마는 시스템 · 밝게 · 어둡게). 행 상세 패널은 보기에 그대로 있고, 패싯·AI·작업 공간 탐색기·검사 결과·셀 값 표시줄 토글이 함께 모였습니다.
    • 성능 대시보드·인덱스 캐시 → 도구. 단축키 목록 → 도움말 ▸ 단축키…(설정의 단축키 쪽). 작업 공간 저장·열기·최근 목록 → 파일.
    • 작업 공간 · 통계 · 시각화 · 품질 메뉴는 그대로 상위 메뉴이며 순서만 위 10개로 정리했습니다.
  • 도구 모음 — 열기 · 작업 공간 저장 | 되돌리기 · 다시 실행 | 찾기 | 필터 | 정렬 | 셀 편집 · 시트 편집 | 조건부 서식 아이콘 그룹, 오른쪽에 패널 토글(작업 공간 탐색기 · 행 상세 · AI)과 구분선 뒤 ⚙ 설정. 아이콘은 테마·DPI에 맞춰 다시 그려지고, 툴팁에 이름과 단축키가 나옵니다.
  • 팝업(우클릭) 메뉴 — 셀: 복사, 필터 ▸ (이 값 / 이 값 제외 / ≥ / ≤), 이 컬럼 정렬, 컬럼 숨기기, 조건부 서식, AI에게 묻기 ▸(컬럼 요약 / 이 값을 가진 행 분석). 컬럼 헤더: 정렬·필터·숨기기, 여기까지 열 고정, 너비 자동 맞춤, 빠른 분석 ▸(기술통계 / 빈도 / 분포). 새 행 번호 우클릭 메뉴: 행 복사 · 행 상세 · 행 삽입/삭제. 편집 항목(붙여넣기·지우기·행/컬럼 편집 등)은 시트 편집 모드 밖에서는 비활성이며 메뉴 맨 위 "시트 편집 켜기"로 바로 켤 수 있습니다.
  • 단축키 변경 — Ctrl+, 설정, Ctrl+S 작업 공간 저장, Ctrl+Shift+F 고급 필터, 정렬 해제 Ctrl+Shift+S → Ctrl+Alt+S(Ctrl+S와 혼동 방지). 전체 표는 아래 ⌨️ 단축키 참고.
  • 통합 설정(도구 ▸ 설정…, Ctrl+,) — 일반(테마 시스템/밝게/어둡게, 언어 자동/English/한국어, 시작 때 마지막 작업 공간 다시 열기) · 패널과 배치 · 그리드(셀 최대 줄 수, 글꼴 크기) · 파일과 데이터(기본 인코딩, 닫을 때 인덱스 삭제, 최근 목록 개수) · AI 에이전트(옛 "AI 에이전트 설정…" 대화상자가 이 쪽으로 이동, 채팅의 ⚙도 여기를 엽니다) · 단축키(읽기 전용 표). 확인 / 취소 / 적용 / 이 쪽 기본값으로.
  • 시작 시 패널 상태 — 기본: AI 패널 켜짐, 행 상세 꺼짐, 패싯 꺼짐(탐색기·검사 결과도 꺼짐, 셀 값 표시줄은 켜짐). 설정 ▸ 패널과 배치에서 바꿀 수 있고, "마지막 상태 기억"을 켜면 종료 때의 패널 상태로 시작합니다.
  • omp 지연 시작 — AI 패널이 켜져 있어도 omp 프로세스는 첫 메시지를 보낼 때 시작합니다(그 메시지는 대기열에 들어가 연결되면 전송). 시작 시 "준비됨 — omp는 첫 메시지를 보낼 때 시작합니다"로 표시됩니다.
  • 작업 공간별 패널 배치 — .ncvws에 선택 항목 layout(패널 표시 + 상세·탐색기·에이전트 폭)이 저장됩니다. 파일 형식은 그대로 v2이고 layout이 없는 옛 파일은 앱 시작 배치를 씁니다. v3.1.x는 layout을 무시하므로 v3.2 파일을 그대로 열 수 있습니다. 배치만 바꿔도 "저장하시겠습니까?"를 묻지 않지만, 작업 공간 저장·닫기 때 함께 기록됩니다. 작업 공간을 열면 그 파일의 배치를 복원합니다.
  • 창 크기·위치 기억 — 종료 때 크기·위치·최대화 상태를 저장해 다음 실행에 복원합니다(모니터가 바뀌어 화면 밖이면 보정). 패널 폭은 분할선을 끌 때 저장됩니다.
  • 테마 "시스템"·언어 "자동" — 시스템 테마는 Windows 설정을 실시간으로 따라가고, 언어 자동은 Windows 표시 언어(한국어면 한국어)를 따릅니다.
  • 파일 ▸ 작업 공간 닫기 — 작업 공간 파일이 열려 있거나 원본·뷰가 있을 때만 켜집니다(단축키 없음). 저장 안 한 변경이 있으면 저장 / 저장 안 함 / 취소를 묻고(취소하면 아무것도 바뀌지 않음), 파일이 있으면 앱 종료처럼 패널 배치만 조용히 반영합니다. 이어서 모든 탭(저장 안 한 편집 확인 포함)·원본·뷰를 닫고, 작업 공간 파일·제목·AI 에이전트 작업 공간 상태를 비우며(omp는 아직 시작 전이면 계속 첫 메시지까지 미룹니다), 앱 시작 패널 배치(AI 켜짐/상세 꺼짐 등 설정·마지막 상태 규칙)로 돌아가고 최근 목록을 갱신합니다.

v3.1.1 — 스크롤 끊김 개선

  • 스크롤 끊김 개선 — 메인 그리드에 이중 버퍼링을 켰습니다. 30열·30만 행 파일에서 휠 한 단계(3행) 그리기가 약 20 ms(60 fps 한 프레임 16.7 ms 초과) → 약 4 ms, 페이지 단위 이동이 약 150 ms → 약 21 ms로 줄었습니다.

v3.1.0 — 작업 공간별 에이전트: 대화 이어 가기, 작업 공간 설정, 메모, 뷰 출처

  • 작업 공간 파일 v2 — .ncvws가 version: 2가 되고 agent 섹션(대화 연결·승인 모드·데이터 정책·로컬 Python 허용·메모)이 생겼습니다. 뷰마다 createdBy(user / agent / wizard:join·append·compare·group)·createdUtc, 에이전트 뷰는 request(그 턴의 사용자 메시지, 500자까지)도 기록합니다. v1 파일은 그대로 열립니다(에이전트 섹션·출처 없음). v1만 아는 앱은 v2 파일을 "더 새로운 버전이 만든 파일"로 거부합니다.
  • 작업 공간별 대화 — 작업 공간을 저장하면 지금 대화(omp 세션 id + .jsonl 경로)가 파일에 연결됩니다(세션 파일이 디스크에 있을 때만 — 아직 메시지가 없는 대화는 저장하지 않음). 작업 공간 파일을 열면 그 대화를 이어 가고(omp --resume, 파일이 옮겨졌으면 ~/.omp/agent/sessions/*에서 id로 찾음, 채팅 기록 다시 불러옴) 안내가 표시됩니다. 저장된 대화가 없어졌으면(예: 다른 PC에서 온 파일) 새 대화로 시작하고 채팅에 경고가 표시됩니다. 작업 공간을 바꾸면 대화도 바뀌고 omp가 그 작업 공간의 대화·분석 폴더로 다시 시작합니다. 작업 공간 ▸ 이 작업 공간의 새 대화 시작(작업 공간 파일이 열려 있을 때만; 확인 후 저장 시 연결 교체, 이전 대화는 omp 세션 목록에 남음). 작업 공간 파일이 없으면 예전처럼 매번 새 대화입니다. 대화 연결도 작업 공간 내용이므로 바뀌면 "수정됨"으로 보고 닫기·전환 때 저장을 묻습니다.
  • 작업 공간별 에이전트 설정 — 승인 모드·데이터 공유 정책·로컬 Python 허용을 작업 공간에 저장합니다. 보안 규칙: 실제 값은 앱 설정과 작업 공간 값 중 더 엄격한 쪽이며, 받은 작업 공간 파일은 조일 수만 있고 풀 수 없습니다(승인: 항상 묻기 > 편집 자동 승인 > 모두 허용, 데이터: 요약만 > 요청마다 승인 > 허용, 로컬 Python: 끔 > 켬). omp 추가 인자(--yolo·--auto-approve·--approval-mode)의 고정이 승인 모드에서는 여전히 우선합니다. 보기 ▸ AI 에이전트 설정…은 작업 공간 파일이 열려 있으면 맨 위에 "설정 적용 대상"(이 작업 공간(기본) / 앱 기본값(모든 작업 공간))을 고르게 하고, 더 엄격한 값이 이겨 적용되지 않은 항목은 확인 후 메시지로 알립니다. omp 경로·추가 인자·행 상한은 계속 앱 전체 설정입니다. 채팅 창 아래 승인 드롭다운을 바꿀 때도 작업 공간이 열려 있으면 "이 작업 공간 / 앱 기본값 / 취소"를 묻습니다. 작업 공간이 실제로 무언가를 조이면 승인 선택 옆에 🔒 작업 공간 표시가 나타나고(툴팁에 제한 내용), 제한이 생길 때 안내가 채팅에 올라옵니다.
  • 작업 공간 메모 — 작업 공간 ▸ 작업 공간 메모…(최대 20,000자; 데이터 설명·핵심 관계·분석 목표). 파일에 저장되며 저장 안 한 작업 공간에서도 쓸 수 있습니다(이때는 저장 안내가 나타남). 에이전트는 ws.notes로 읽고 ws.set_notes(notes, mode: replace|append)로 수정을 제안합니다(전/후 비교 승인 카드, 데이터 편집 승인이라 편집 자동 승인·모두 허용에서는 자동, 항상 묻기에서는 묻습니다). 메모는 omp를 시작·이어 가는 때마다 시스템 안내문에 4,000자까지 들어가고(더 길면 앞 4,000자 + ws.notes 안내) 사용자가 쓴 데이터로만 취급되어 안내문·데이터 정책·승인 모드·사용자 요청을 덮어쓰지 못합니다. 실행 중 메모를 고치면 ws.notes·ws.list_tables(workspace_notes: 앞 1,000자 + 전체 글자 수)로 바로 보이고, 시스템 안내문 사본은 다음 시작·이어 가기 때 갱신됩니다.
  • 뷰 출처 — 모든 뷰가 누가(사용자 SQL 편집기 "뷰로 저장" / 에이전트 ws.create_view·append·compare·group / 마법사)·언제(UTC)·(에이전트 뷰는) 어떤 요청으로 만들었는지 기록합니다. 작업 공간 탐색기에서 에이전트가 만든 뷰는 ◈ 대신 ✦로 표시되고, 모든 뷰의 툴팁이 "✦ AI 에이전트가 만듦 · 2026-10-05 14:02 / 요청: …"처럼 시작합니다. 뷰 SQL을 SQL 편집기에서 고쳐 쓰면 사용자가 만든 뷰가 됩니다(이름만 바꾸면 유지). ws.list_tables에는 뷰마다 created_by·created_utc·user_request가 추가됩니다.
  • 알려진 제한 — 대화 연결은 작업 공간 저장 시에만, 세션 파일이 있을 때만 저장되며 경로는 이 PC의 것입니다(다른 PC = 새 대화 + 안내, 옮긴 파일 = id로 찾음) · 메모를 고쳐도 omp는 다시 시작하지 않습니다 · 작업 공간 설정은 조이기만 가능(풀려면 앱 기본값 변경) · 출처 불명의 작업 공간 파일도 자기 메모를 가질 수 있지만 메모는 에이전트에게 데이터일 뿐 정책을 바꾸지 못합니다 · 공유한 .ncvws의 세션 id·경로는 로컬 경로 외에 새는 것이 없고 대화 내용은 파일에 저장되지 않습니다.

v3.0.0 — 여러 파일 작업 공간: 탭, DuckDB 질의, 뷰, 조인·비교 마법사, 에이전트 ws.*

  • 다중 문서 탭 — 파일마다 탭. Ctrl+Tab / Ctrl+Shift+Tab 전환, Ctrl+W·가운데 클릭으로 닫기, 탭 우클릭 메뉴. 엑셀·SAS·SPSS·SQLite 통합 문서는 탭 하나에 하단 시트 버튼.
  • 작업 공간 탐색기 — 보기 ▸ 작업 공간 탐색기(Ctrl+Shift+W)에서 원본·테이블·뷰를 보고 데이터 파일을 원본으로 추가.
  • DuckDB 엔진 — CSV 하나 = 테이블 T(TRY_CAST로 타입 부여) + T__raw(모든 열 원본 텍스트). 엑셀·SAS·SPSS·SQLite는 스키마 하나에 시트/테이블이 테이블("설문"."명단"). 질의는 SELECT 문 하나만 허용. CP949 CSV는 UTF-8 임시 사본으로 변환해 읽습니다.
  • SQL 편집기 — 작업 공간 ▸ 새 질의(Ctrl+Alt+Q; Ctrl+Shift+Q는 품질 프로파일 실행 그대로). 결과는 Result 탭으로 열립니다.
  • 뷰 — 이름 + SQL로 만든 읽기 전용 View 탭. 원본이 바뀌면 ⚠ 표시, 새로 고침으로 다시 계산.
  • 마법사 — 조인(조인 진단: 일치/불일치 키·null·중복·카디널리티·예상 행 수)·이어 붙이기·비교(추가/삭제/변경)·그룹 집계. 마법사가 만든 SQL을 보고 편집할 수 있습니다.
  • 에이전트 ws.* 도구 — ws.list_tables · ws.describe · ws.add_source · ws.query · ws.check_join · ws.create_view · ws.append · ws.compare · ws.group · ws.materialize · ws.open · ws.switch. ws.query는 데이터 정책을 따릅니다: 요약만이면 행 수·열 타입·null/고유 수·숫자 최소/최대/평균만, 승인 모드면 승인 후 상한까지 행, 허용이면 상한까지 행. open_tab이면 사용자에게는 전체 결과가 Result 탭으로 보입니다. 생성·실체화는 승인 모드를 따릅니다.
  • 작업 공간 파일(.ncvws) — 파일 ▸ 작업 공간 열기(Ctrl+Shift+O) / 저장, 최근 목록. 원본은 상대+절대 경로로 저장하고 없는 파일은 위치 지정/건너뛰기. 뷰 정의만 저장하고 데이터는 저장하지 않습니다. 설치 프로그램이 .ncvws를 등록합니다.
  • 분석 폴더 고정 — 에이전트 분석 폴더는 <작업 공간 폴더>\<작업 공간 이름>_분석결과(작업 공간 파일이 없으면 첫 데이터 파일의 폴더)로 작업 공간 안에서 바뀌지 않습니다.
  • 알려진 제한 — 뷰 새로 고침은 그 View 탭의 필터·정렬을 초기화 · 뷰는 읽기 전용(파일로 저장 후 열어 편집) · 식별자성 열은 텍스트이므로 숫자 비교는 CAST 필요 · CSV 스캔은 단일 스레드이며 열 개수가 다른 행을 허용 · DB 원본은 앱이 다시 가져올 때만 갱신 · DuckDB 때문에 포터블 exe가 x64 기준 약 48 MB · 뷰가 쓰는 원본의 이름 바꾸기·제거는 거부됩니다.

v2.2.0 — 승인 모드, 열 중간 삽입·이동, 조건부 서식 테마·되돌리기

  • 승인 모드 선택 — 채팅 창 아래 드롭다운: 항상 묻기 / 편집 자동 승인 / 모두 허용(기본). omp 추가 인자에 --approval-mode·--yolo·--auto-approve가 있으면 그 값으로 고정되어 드롭다운이 잠기고, 마우스를 올리면 이유가 보입니다. "모두 허용"은 Python·셸·파일 쓰기를 묻지 않으므로 고를 때 확인 창을 띄웁니다. 앱의 데이터 편집·저장 승인 카드도 모드를 따르며, 원시 행 공유는 항상 데이터 정책을 따릅니다.
  • 열 중간 삽입·이동 — 현재 열 앞/뒤에 새 열 삽입, 시트 편집 모드에서 헤더를 끌어 열 순서 변경(왼쪽/오른쪽 이동 메뉴도). 각각 실행 취소 1단계, 저장에 반영, 원본 불변.
  • 조건부 서식 — 서식 전용 되돌리기/다시 실행(툴바 ↶ 서식, 최근 20개, 에이전트 변경 포함). 이름 있는 테마 색 7가지와 직접 고른 색의 테마 자동 조정으로 어두운 테마에서도 읽기 쉽게.

v2.1.0 — 편집·서식 확장, 정규식 강화, Python 분석

  • 열 추가·삭제 — 시트 편집 모드에서 빈 열 추가(오른쪽 끝, 채울 값 선택)와 열 삭제(실행 취소 가능, 저장 시 제외, 원본 불변). 편집 메뉴·셀·헤더 오른쪽 클릭 메뉴.
  • 셀로 이동 — 좌상단 주소 칸에 120, R120C3, C3, 이름:120, [이름]120을 입력하고 Enter(또는 Ctrl+G).
  • 조건부 서식 — 보기 ▸ 조건부 서식…: 고급 필터 식(정규식·NOT·* 포함)으로 셀 또는 행 전체 강조(배경·글자색·굵게), 숫자 열 2·3색 색상 척도. 파일별 저장된 보기에 함께 저장.
  • 정규식 강화 — 모든 정규식에 같은 시간 제한과 시간 초과 보고(⚠), 컬럼 필터의 잘못된 정규식 즉시 안내, 고급 필터 NOT·!matches·matches_cs·*(모든 컬럼), 정규식 찾아 바꾸기(Ctrl+H, $1 캡처, 미리보기, 실행 취소 1단계), 정규식으로 새 열 추출, 패턴 테스트.
  • AI 에이전트 도구 추가 — 행·열 추가/삭제, 셀 주소 이동, 조건부 서식, 정규식 개수 세기·바꾸기(승인 카드).
  • 로컬 Python 분석(선택, 기본 꺼짐) — 보기 ▸ AI 에이전트 설정…의 "로컬 Python 분석 허용"을 켜면 에이전트가 현재 보기를 <파일명>_분석결과\data\로 내보내 이 PC의 Python(pandas·statsmodels·matplotlib 등)으로 분석하고, 마크다운 보고서와 그림(PNG·JPEG·PDF·SVG)을 같은 폴더에 저장해 보고서 창·그림 창·채팅 미리보기로 보여 줍니다. Python 실행은 대화마다 처음 한 번 승인. 스크립트 출력은 모델이 읽으므로, "요약만" 정책에서는 집계만 출력하도록 안내합니다(완전한 강제는 아님).
  • Python 진단(LSP) 내장 — 처음 사용할 때 %LOCALAPPDATA%\NanumCsvViewer\python-tools에 basedpyright·ruff를 설치하고, 분석 폴더에 omp LSP 설정을 써서 에이전트가 작성하는 .py 스크립트의 오류를 바로 잡습니다.

v2.0.1 — 필터 연산자 추가

  • 고급 필터·AI 에이전트 필터에 startswith·endswith·matches(정규식) 연산자 — 예: 이름 startswith "김", 이름 matches "^김.{1,2}$". 정규식은 대소문자 무시이며, 셀 하나당 0.25초를 넘기면 그 셀은 불일치로 둡니다.
  • 에이전트 안내문에서 csv.* 도구 호출 방식을 명확히 해 잘못된 도구 이름 호출을 줄였습니다.

v2.0.0 — AI 에이전트 내장

  • AI 에이전트 패널 — 보기 ▸ AI 에이전트 패널(Ctrl+Shift+A, 툴바 ✦ AI). 오른쪽 채팅 창에 말로 요청하면 에이전트가 지금 열린 창을 직접 조작합니다: 파일·컬럼 요약, 필터·정렬·셀 이동, 기술통계·GLM·ANCOVA·GLzM·로지스틱, 품질 검사, 셀 편집·되돌리기·새 파일로 저장. 분석 결과는 평소의 결과 창으로도 열립니다.
  • omp(oh-my-pi) 기반 — 앱이 omp --mode rpc-ui를 띄워 호스트가 되고 앱 기능을 csv.* 도구로 등록합니다. 모델·로그인·세션은 omp 설정을 그대로 씁니다. omp가 없으면 패널에 찾아보기·설치·다운로드 단추가 나오고 AI 환경 설정 도우미가 열리며 나머지 기능은 그대로입니다. 채팅 화면은 RAD Agent의 채팅 UI(MIT)를 이식했습니다(WebView2).
  • 데이터 공유는 기본 "요약만" — 스키마·집계·분석 결과만 모델로 보내고 원시 셀 값은 보내지 않습니다. 보기 ▸ AI 에이전트 설정…에서 "행 값 — 요청마다 승인" 또는 "승인 없이(상한까지)"로 바꿀 수 있습니다. 에이전트를 켜지 않으면 데이터는 PC를 떠나지 않습니다.
  • 승인 — 셀 편집과 저장은 항상 채팅의 승인 카드로 묻고(편집은 덮개에 쌓여 Ctrl+Z 가능, 원본 불변), omp 자체의 셸·파일 쓰기 도구도 같은 카드로 묻습니다. 실행한 도구는 %LOCALAPPDATA%\NanumCsvViewer\agent\tool-log.jsonl에 기록합니다(셀 값 제외).
  • 설계: docs/AGENT_INTEGRATION_PLAN.md.

v1.20.0 — 셀 편집 · 고급 통계 한계 해소

  • 셀 편집(아래) — 기본은 보기 전용. 단일 셀 편집(적용 즉시 보기 모드)과 시트 편집 모드(되돌리기, 블록 붙여넣기, 컬럼 이름 변경, 행 삽입·삭제)를 구분합니다. 원본은 바뀌지 않고 새 파일(CSV, 엑셀 원본은 .xlsx)로 저장하며, 비정상 종료 시 복구를 제안합니다.
  • GLzM — 오프셋·노출·분산/빈도 가중치·이항 시행 수. 이런 모형도 저장해 새 데이터에 적용할 수 있습니다(필요한 열을 요구).
  • ANCOVA — 여러 요인과 요인 간 상호작용, 요인별·셀 보정 평균.
  • ONNX·모형 저장 — SVM·나이브 베이즈·LDA·다항 로지스틱 추가, 선형·확률 모형은 float64 정밀도 선택. AutoML에 다항 로지스틱·큰 예산 SVM 후보.
  • PDF 직접 작성 — 프린터 드라이버 없이 한글 폰트를 임베딩한 PDF.
  • 속도·취소 — AdaBoost 152.7 s → 1.7 s(620만 행), K-means 자체 구현(즉시 취소), PCA 취소, SVM·랜덤 포레스트 행 상한 입력.
  • 한국어화 — 엔진 오류, 변수 매핑 근거, 데이터 품질 메시지가 한국어 화면에서 한국어로 표시됩니다.

편집 기능 (기본은 보기 전용)

  • 셀 편집 — 툴바 ✎ 셀(또는 편집 ▸ 셀 편집…, F2): 선택한 셀 하나를 대화상자에서 고치면 바로 보기 모드로 돌아옵니다.
  • 시트 편집 모드 — 툴바 ✎ 시트(Ctrl+Shift+E): 켜 두는 동안 여러 셀을 인라인 편집(더블클릭·F2, Enter 확정, Esc 취소)하고 아래 시트 전용 기능을 쓸 수 있습니다. 다시 눌러 끄면 보기 모드이며, 제목 표시줄과 버튼으로 현재 모드를 알 수 있습니다. 셀 편집(단일 셀 대화상자)에서는 붙여넣기·행 삽입/삭제·이름 변경이 거부됩니다.
    • 되돌리기/다시 실행 — Ctrl+Z / Ctrl+Y(편집 메뉴에도 있음). 셀 하나의 커밋, 붙여넣기 한 번, 지우기 한 번, 행 삽입/삭제 한 번, 컬럼 이름 변경 한 번, 모두 버리기가 각각 한 단계입니다(이력은 최근 500단계·200만 변경까지).
    • 블록 붙여넣기 — Ctrl+V: 엑셀·표 계산기 복사본(탭 = 열, 줄바꿈 = 행, 따옴표 셀 속 줄바꿈 포함)을 선택한 셀부터 붙여넣습니다. 셀 하나를 복사해 여러 셀을 선택했으면 선택 전체를 채웁니다. 블록이 표를 벗어나면 아무것도 붙여넣지 않고 안내합니다. Delete는 선택한 셀을 비웁니다. 100셀을 넘으면 확인을 받습니다.
    • 컬럼 이름 변경 — 헤더를 더블클릭(또는 편집 ▸ 컬럼 이름 변경…). 새 이름은 필터·차트·통계 대화상자에 바로 쓰이고 저장 파일의 첫 줄에 기록됩니다. 비우거나 다른 컬럼과 같은 이름은 거부합니다. 옛 이름을 쓴 표현식 필터는 계속 동작하되 칩에 ⚠가 붙습니다.
    • 행 삽입/삭제 — 편집 ▸ 위/아래에 행 삽입, 선택한 행 삭제(우클릭 메뉴에도 있음). 추가한 행은 초록색이며, 행 번호는 편집한 표 기준으로 다시 매겨집니다. 저장 파일은 삭제한 행을 건너뛰고 추가한 행을 그 위치에 같은 줄바꿈으로 씁니다.
    • 컬럼 삽입/삭제 — 편집 ▸ 컬럼 삽입…(이름, 위치 = 현재 컬럼 앞·뒤·맨 왼쪽·맨 오른쪽, 선택적으로 모든 행에 같은 값) / 컬럼 삭제, 헤더 우클릭 메뉴에도 있습니다. 삽입은 컬럼 추가와 위치 지정이 한 단계라 Ctrl+Z 한 번으로 사라집니다. 삭제는 원본 컬럼도 가능하고 원본 파일은 그대로입니다: 삭제한 컬럼은 그리드·필터·정렬·통계·내보내기·에이전트에서 사라지고(뒤 컬럼 번호가 당겨짐) 저장 파일(CSV·xlsx)에서 빠지며, Ctrl+Z 한 번으로 값·이름 변경과 함께 복원됩니다. 마지막 남은 컬럼은 지울 수 없습니다. 삭제한 컬럼을 가리키던 정렬·컬럼 필터는 정리되고, 컬럼 위치로 만든 "셀 값" 필터는 해제됩니다(표현식 필터는 새 헤더로 다시 컴파일).
    • 컬럼 이동 — 시트 편집 모드에서 헤더를 좌우로 끌어다 놓으면 컬럼이 그 자리로 옮겨집니다(놓을 경계가 굵은 선으로 표시되고 Esc로 취소, 필터 깔때기·폭 조절 경계는 제외). 편집 ▸ 컬럼 왼쪽/오른쪽으로 이동과 헤더 우클릭 메뉴도 있으며 숨긴 컬럼은 건너뜁니다. 이동 한 번 = 한 단계. 표시 순서는 그리드·필터·정렬·분석·차트·에이전트·저장 파일(CSV·xlsx)·복구 저널에 모두 같게 적용되고, 정렬 키·컬럼 필터·숨김·타입 지정은 옮긴 컬럼을 따라가며 컬럼 폭도 유지됩니다. 원본 파일은 그대로입니다.
  • 편집하면 바로 반영 — 필터·정렬이 켜져 있으면 편집이 멈춘 뒤(약 0.4초) 현재 데이터로 다시 계산하고(보던 행을 유지, 조건에서 벗어난 행은 숨겨지며 안내), 타입 배지·패싯을 갱신합니다. 이미 열려 있는 고급 통계 결과·차트 창은 결과를 몰래 바꾸지 않고, 맨 위에 "이 창을 만든 뒤 데이터가 편집되었습니다 — 분석을 다시 실행하세요" 안내를 붙이고 제목에 ⚠를 붙입니다. 데이터 품질 발견 목록은 비우고 다시 검사하도록 안내합니다.
  • 원본은 바뀌지 않습니다 — 편집은 메모리에 쌓이고(편집한 셀은 앰버색), **편집 ▸ 편집 내용 저장…**으로 새 파일에 저장합니다. 편집 안 한 행은 원본 바이트 그대로 복사하고, 저장하지 않은 편집이 있으면 파일을 닫거나 바꿀 때 확인합니다.
    • 엑셀 원본(.xlsx/.xlsm/.xls) 은 기본이 .xlsx 저장입니다(해당 시트 하나, 모든 값을 텍스트로 기록해 007·긴 숫자가 그대로이며 엑셀이 "텍스트로 저장된 숫자" 표시를 띄울 수 있음). 엑셀의 행(1,048,576)·열(16,384)·셀 글자 수(32,767) 한도를 넘으면 부분 파일 없이 거부하고 CSV 저장을 권합니다. 서식·수식·다른 시트는 가져오지 않으므로 저장되지 않습니다.
    • SAS·SPSS·SQLite 원본은 CSV로 저장되며, 저장 전에 대화상자가 "값은 텍스트로 기록되고 변수 라벨·값 라벨·선언 타입은 유지되지 않는다"고 알려 줍니다.
    • 저장 전 복구 저널 — 저장하지 않은 편집(셀·이름·삭제/추가 행)을 편집 후 약 1.5초 뒤 %LOCALAPPDATA%\NanumCsvViewer\edits\에 기록합니다. 앱이 비정상 종료돼도 같은 파일(경로·크기·수정 시각이 같을 때)을 다시 열면 복구할지 묻고, 저장·버리기를 하면 저널을 지웁니다. 원본이 바뀌었으면 복구하지 않습니다(60일 지난 저널은 자동 정리).
  • 숫자 변환 없음 — 입력값은 문자열 그대로 보관·저장되어 001의 선행 0이 사라지지 않습니다(엑셀로 CSV를 다시 열 때 엑셀이 0을 지우는 것은 엑셀의 동작이며, 앱은 값을 바꾸지 않습니다).

v1.19.0 — 고급 통계 Phase 3: AutoML·모형 저장/ONNX·보고서·변수 매핑

  • AutoML — 여러 학습기(선형·로지스틱, 나이브 베이즈, LDA, KNN, 트리, 랜덤 포레스트, 그래디언트 부스팅, AdaBoost, SVM)를 학습 분할 안에서 교차검증해 리더보드로 보여 주고, 시험 분할로 최종 성능을 정직하게 보고합니다. AdaBoost(분류·회귀)도 추가했습니다.
  • 모형 저장·적용 — 결과창의 **모형 저장…**으로 모형을 파일로 남기고, **저장된 모형 적용…**으로 다른 파일(현재 뷰)에 적용해 원본 행번호와 함께 예측 CSV를 만듭니다. 목표 컬럼이 있으면 성능도 계산합니다.
  • ONNX 내보내기 — 선형·로지스틱·트리·랜덤 포레스트·부스팅·AdaBoost 모형을 표준 ONNX로 내보냅니다(onnxruntime 결과와 일치 검증).
  • 보고서 내보내기 — 결과를 HTML·Excel(.xlsx)·PDF로 저장합니다. 결과 표는 실제 표/시트로 들어갑니다. PDF는 프린터 드라이버 없이 직접 작성하며(A4, 설치된 한글 글꼴을 부분집합으로 내장, 글자 선택·검색 가능) 맑은 고딕 같은 한글 글꼴이 없으면 HTML 내보내기를 권합니다.
  • 변수 매핑 추천(OMOP/CDISC) — OHDSI CDM 필드 명세나 CDISC 변수 메타데이터 CSV를 불러오면 현재 파일 컬럼과의 매핑 후보를 근거와 함께 추천하고, 적합성 프로파일 뼈대를 만들어 줍니다.

v1.18.0 — 고급 통계 Phase 2 · 데이터 품질 적합성 프로파일

  • 혼합모형 — 선형 혼합모형(LMM: 임의 절편·기울기, REML/ML, ICC)과 비선형 혼합모형(NLMM: 지수 감쇠·로지스틱 성장·Michaelis–Menten·Emax).
  • 생존분석 — Kaplan–Meier(신뢰구간·중앙값·곡선 창)·로그순위 검정, Cox 비례위험 회귀(위험비·Harrell C).
  • 트리·SVM·부스팅 — 결정트리, 랜덤 포레스트, SVM(선형/RBF), 히스토그램 그래디언트 부스팅(LightGBM/XGBoost 계열, 순수 관리형).
  • 적합성 프로파일(데이터 품질) — 사용자 JSON으로 필수값·타입·길이(CDISC)·코드 목록(파일 가능)·패턴·범위·개념 참조(예: OMOP CONCEPT의 concept_id + domain) 검사. 위반 행은 필터 칩·행 이동으로 이어집니다.
  • OHDSI DQD 결과 가져오기 — DataQualityDashboard 결과 JSON을 검사 결과 패널에 표시합니다.
  • statsmodels·scipy·sklearn 대조 테스트, 코드 리뷰 결함 8건 수정. 500 MB(620만 행)에서 대부분 30초 이내(기록).

v1.17.0 — 고급 통계·머신러닝 (Phase 1, ALGLIB)

  • '고급 통계' 메뉴 신설(데이터 품질 옆) — 16개 분석: 일반선형모형(GLM)·공분산분석(ANCOVA)·반복측정 분산분석(Mauchly·GG/HF 보정)·일반화선형모형(가우시안·이항·포아송·감마)·로지스틱 회귀(오즈비·AUC·Hosmer–Lemeshow), 비모수 검정 5종(Mann-Whitney U·Wilcoxon 부호순위·부호·Kruskal-Wallis+Dunn·Friedman), K-means·KNN·나이브 베이즈, PCA·LDA·특성 순위(Benjamini–Hochberg q).
  • 모형식 편집기 — y ~ x1 + C(group) + x1:group, a*b, - 1 문법. 컬럼 더블클릭으로 삽입하고 입력마다 식과 컬럼을 검증합니다.
  • 대용량 전체 분석 — 필요한 컬럼만 수치로 압축해 현재 뷰 전체를 한 번에 읽습니다. 500 MB(620만 행) CSV에서 GLM 5초·로지스틱 7초·K-means 9초·KNN 23초 등 전 항목 30초 이내(실측, 기록).
  • 정직한 결과 — 사용·제외 행 수, 비수렴·완전 분리·별칭(선형 종속) 항, 표본 근사, 가정 경고를 결과에 표시합니다. 분류기는 학습 분할로만 스케일링하고 최다 클래스 기준선과 함께 보고합니다.
  • 검증 — statsmodels·scipy·sklearn 참조값과 대조하는 단위 테스트, 코드 리뷰로 찾은 결함 8건 수정·회귀 테스트.
  • 품질 → 분석 연동 — 검사 결과 패널의 고급 통계 ▾ 버튼. 심각한 품질 발견이 남아 있으면 먼저 알립니다.
  • ALGLIB Commercial(순수 C#)을 단일 exe에 포함합니다. 소스는 라이선스상 저장소에 없으며 빌드 방법은 아래 "빌드 & 실행"을 참고하세요.

v1.16.0 — 탐색기 파일 열기 수정 · 품질 기준선 비교 · 참조 무결성 검사

  • 탐색기에서 연 파일이 열리지 않던 문제 수정 — 연결 프로그램/더블클릭으로 실행하면 전달된 파일(CSV·엑셀·SAS·SPSS·SQLite)을 창이 뜬 직후 바로 엽니다. 연결 명령이 %1을 따옴표로 감싸지 않아 공백 포함 경로가 쪼개진 경우도 복구합니다.
  • 설치 관리자가 연결 프로그램을 등록 — .csv .tsv .txt .xlsx .xlsm .xls .sas7bdat .sav .db .sqlite .sqlite3의 "연결 프로그램" 목록과 설정 ▸ 기본 앱에 나타납니다(Windows 정책상 기본 앱 지정은 사용자가 직접 선택). 제거 시 등록도 지웁니다.
  • 기준선 스냅샷과 비교(데이터 품질 메뉴) — 이전에 내보낸 품질 보고서 JSON과 현재 프로파일을 비교해 행 수·컬럼 추가/삭제·타입 변경·결측률(pp)·고유값 수·수치 범위·위장결측 후보·발견 신규/해소/지속을 보여 줍니다. 한쪽이 부분 스캔이면 근사로 표기하고, 규칙·키·참조처럼 사용자가 실행하는 검사가 현재 세션에 없으면 "해소"가 아니라 재검사 안 됨으로 구분합니다. Markdown/JSON으로 내보낼 수 있습니다.
  • 참조 무결성 검사(데이터 품질 메뉴) — 현재 파일의 (복합)키 값이 다른 시트 또는 다른 파일의 부모 키에 있는지 전수 검사합니다. 고아 행은 발견 패널에서 필터 칩·행 이동으로 이어지며, 빈 키는 기본으로 제외하고 건수를 따로 표시합니다. 부모 키 집합이 메모리 예산을 넘으면 부분 결과 없이 중단합니다.

v1.15.1 — 대용량 피벗·필터 안정성 개선

  • 피벗은 현재 뷰를 순차적으로 읽으며 전체 행을 집계합니다. 표는 행·열 페이지로 탐색하고, 차트는 현재 표 페이지의 범위를 표시합니다. 합계는 페이지에 관계없이 전체 집계 범위 기준입니다.
  • 집계·합계 계산은 백그라운드에서 실행하며 취소할 수 있습니다. 예상 집계 메모리가 예산을 넘으면 필터·날짜 그룹·차원 축소를 안내하고 이전 결과를 유지합니다.
  • 헤더 필터 후보는 200개씩 표시하며 검색·선택 상태를 페이지 간 유지합니다. 후보 목록의 메모리 예산을 넘는 컬럼은 전체 행에 적용되는 텍스트·값 목록 필터를 사용합니다.
  • 패싯 분포는 백그라운드에서 계산하며 사용한 표본 범위를 표시합니다.
  • 일반 분석·차트 데이터 수집도 백그라운드에서 수행합니다. 완전한 스냅샷의 메모리 예산을 넘으면 행 필터 후 재시도하도록 안내하며, 일부 행만 분석한 결과를 내놓지 않습니다.
  • 카이제곱 검정은 관측된 조합만 저장해 큰 카테고리 교차표를 처리하며, 기대빈도가 작은 경우 근사 p값 해석을 제한합니다.
  • 원인·검증 결과·후속 점검 항목: 안정성 점검 기록.

✨ 주요 기능

  • 대용량 즉시 열람 — 파일 전체를 메모리에 적재하지 않고, 바이트 오프셋 인덱스 + DataGridView 가상 모드로 보이는 행만 그때그때 읽습니다. 1 GB 파일도 첫 페이지가 1초 안에 뜹니다.
  • 분석 스킬 팩·관리형 Python 환경 — 로컬 Python을 켜면 에이전트가 번들 분석 스킬 20개(임상 7·통계 9·기계학습 3·앱 1)를 쓰고, 앱이 만든 독립 venv에 고정 버전 패키지를 설치합니다. 도구 ▸ Python 분석 재현 패키지 내보내기…로 스크립트·보고서를 묶어 냅니다.
  • 백그라운드 인덱싱 + 진행 표시 — 첫 페이지를 보여주면서 나머지를 백그라운드로 인덱싱하고, 하단 상태바에 진행바 + % 를 표시합니다. 완료되면 "준비 완료"와 함께 필터/정렬이 활성화됩니다. 인덱서는 벡터화 바이트 스캔(SearchValues) 과 읽기·스캔 겹치기(더블 버퍼링) 로 동작해, 일반 NVMe에서 인덱싱 처리량이 ~2 GB/s에 이릅니다.
  • 한글 인코딩 자동 감지 + 수동 전환 — BOM 확인 → strict UTF-8 검증 → 실패 시 CP949(EUC-KR) 폴백. 상태바 우측의 인코딩 표시(신호등 왼쪽)를 클릭하거나 View ▸ 인코딩 메뉴로 즉시 바꿔 다시 디코딩할 수 있습니다(재인덱싱 불필요).
  • 적응형 메모리 — RAM 예산(기본 1.5 GB) 이내면 원본 바이트를 메모리에 보관해 필터/정렬이 빠르고, 초과하면 자동으로 디스크 스캔 모드로 전환해 메모리를 일정하게 유지합니다.
  • 검색 / 필터 / 정렬 — 스트리밍 "Find Next", 컬럼별/전체 필터, 컬럼 헤더 클릭 정렬. 헤더 Shift+클릭으로 다중 컬럼 정렬(우선순위 표시)을 지원하며, 같은 값끼리는 원본 순서를 유지하는 안정 정렬입니다.
  • 한눈에 보는 상태바 — 좌측에 행 수 · 파일 용량, 우측에 인코딩 위젯과 상태 표시등을 표시합니다.
  • 조건 누적 필터(AND) — 텍스트 필터에 더해, 선택한 셀의 값으로 즉시 필터를 거는 Filter by Cell 버튼/우클릭 메뉴를 제공합니다. 여러 조건이 AND로 누적되어 Excel처럼 점점 좁혀 볼 수 있습니다. 조건을 추가할 때는 전체가 아니라 현재 결과만 다시 거르므로(증분 필터) 2중·3중으로 갈수록 빨라집니다.
  • 상태 표시등(신호등) — 상태바 우측 끝의 색 점으로 상태를 한눈에: ⚪ 대기 · 🟡 불러오는 중 · 🟠 작업 중 · 🟢 준비 완료.
  • 원본 행번호 — 행 헤더에 원본 파일 기준 행번호를 표시합니다. 필터·정렬해도 원래 위치를 추적할 수 있고, 헤더 폭은 드래그로 조절할 수 있습니다.
  • 셀 내 줄바꿈 표시 — 따옴표로 감싼 필드 안의 줄바꿈을 여러 줄로 보여줍니다(대용량에서도 끊김 없이 셀 선택).
  • 선택 항목 보기 — 그리드 위 셀 값 표시줄(높이 확장 가능)과, 토글 가능한 우측 상세 패널(선택한 행의 모든 컬럼을 컬럼명+값으로 표시, F4; v3.2.0부터 시작 시에는 꺼져 있고 설정에서 켜 둘 수 있음). 한 셀에 여러 줄이 담긴 데이터를 읽기에 좋습니다.
  • 다국어(영어·한국어) — 기본은 영어이며, Windows 표시 언어가 한국어이면 자동으로 한국어로 시작합니다. 도구 ▸ 설정 ▸ 일반 또는 보기 ▸ 언어에서 즉시 전환(자동/English/한국어)할 수 있고, 선택은 저장됩니다.
  • 라이트/다크/시스템 테마 — 도구 ▸ 설정 ▸ 일반 또는 보기 ▸ 테마에서 시스템 · 밝게 · 어둡게를 고릅니다. 첫 실행 시 Windows 시스템 테마를 따르고(실시간 반영), 선택은 저장되어 다음 실행에 복원됩니다.
  • 여러 파일 작업 공간 (v3) — 탭으로 여러 파일을 열고, DuckDB SQL·뷰·조인/비교 마법사로 파일 간 분석. v3.1부터 작업 공간 파일(.ncvws)에 에이전트 대화·설정(더 엄격한 쪽 적용)·메모·뷰 출처가 함께 저장됩니다(위 v3.1.0·v3.0.0 항목 참고).
  • 사용법 도움말 — Help ▸ How to Use(F1)에서 주요 기능과 단축키를 한 화면에서 안내합니다.
  • 전용 앱 아이콘 — 작업표시줄·창 제목·설치 관리자·제거 항목에 일관된 아이콘이 적용됩니다.

✨ v1.15.0 신규 — 데이터 품질 검토 (전수 프로파일 + 발견→필터 루프)

  • '데이터 품질' 메뉴 신설 — 품질 프로파일 실행(Ctrl+Shift+Q)이 파일 전체를 병렬로 1패스 스캔해(현재 뷰의 200만 행 상한과 무관, 1 GB·1,470만 행을 약 4.3초에) 완전성·적합성·타당성 문제를 한 번에 찾습니다: 결측률(빈값·공백·NA류 구분)·위장결측 후보(99·999·-9·"NA"·1900-01-01 등 sentinel)·타입 부합·코드북 대조(SPSS 값 라벨·SAS .sas7bcat 카탈로그의 허용 코드 밖 값)·상수/빈 컬럼·IQR 이상치·미래 날짜·완전 중복 행·필드 수 불일치.
  • 발견 → 필터 → 수정 루프 — 하단 검사 결과 패널이 발견을 심각도별(심각/경고/정보)로 나열하고, 항목을 클릭하면 위반 행만 남기는 필터 칩으로 변환되며 원본 행번호로 점프합니다. 0~100 점수 게이지 대신 심각도별 건수로 정직하게 보여주고, 검사 범위(전수/부분/생략)를 항상 표기합니다.
  • 키 유일성 · 타당성 규칙 — 사용자 지정 (복합)키 중복을 파일 전체에서 검사하고, "0건이어야 하는 위반식" 규칙(age < 0 OR age > 120, [end_date] < [start_date] 같은 컬럼 간 비교 포함)을 정의·실행하며 JSON 규칙 세트로 저장·공유합니다.
  • 품질 보고서 내보내기 — 발견·컬럼 프로파일·파일 지문(이름·크기·검사 시각·버전)을 HTML / Markdown / JSON으로 출력합니다(JSON은 후속 버전 비교용 안정 스키마 스냅샷).
  • 기능 범위는 4개 AI 모델(Fable 5·Codex·Grok·Opus 4.8)의 2라운드 설계 논쟁으로 확정했습니다(점수 게이지·내장 의료 규칙 팩·자동 수정을 만장일치로 배제 — "뷰어는 심판이 아니라 현미경"). 5앵글 멀티에이전트 코드 리뷰로 18건을 수정했고, 계산 엔진은 합성 데이터 xUnit 테스트로 검증합니다(총 360개 통과).

✨ v1.14.0 신규 — 시각화: 차트 빌더 + 통계 연동 차트 7종

  • '시각화' 메뉴 신설 — 차트 빌더(모델리스·다중 창, 차트 종류 전환 1클릭)와 분포/관계/범주/시계열 프리셋으로 진입합니다. 차트는 현재 필터·정렬된 뷰를 그대로 사용합니다.
  • 차트 7종 + 통계 배지 — 히스토그램(KDE 밀도곡선·정규곡선 + Shapiro-Wilk 배지), 박스플롯(그룹별 + ANOVA F/p/η² 또는 Welch t 배지), 산점도(OLS 회귀선 + r/p 배지), 상관 히트맵(비유의 셀 흐림, 셀 클릭 → 산점도 드릴다운), Q-Q 플롯, 시계열(이동평균), 파레토(누적%). 배지를 클릭하면 검정 전체 결과를 보여줍니다.
  • 대용량 정직 렌더 — 통계는 항상 전수(뷰 상한 2백만 행)로 계산하고 렌더링만 축약합니다: 산점도 5만 점 초과 시 밀도 격자(전수 카운트·로그 명도) 자동 전환, Q-Q는 1만 점 초과 시 결정적 분위 시닝. 렌더 노트에 통계 N과 렌더 모드를 항상 표기합니다.
  • 상호작용 — 호버 툴팁, 드래그/휠 줌 + 더블클릭 초기화(수치축 차트), PNG 저장·클립보드 복사(2×), "현재 뷰로 새로고침".
  • 통계 → 차트 역방향 진입 — 분석 결과창(기술통계·수치분포·빈도·상관·t검정·ANOVA·정규성)에 "차트로 보기" 버튼이 붙어 해당 차트가 컬럼이 채워진 채 열립니다.
  • 설계는 3개 AI 모델(Fable 5·Codex·Grok)의 2라운드 설계 논쟁으로 확정했고, 8앵글 코드 리뷰(딥 줌 크래시·파서 정합성·렌더 캐시 등 14건 수정)를 거쳤습니다. 계산 엔진(회귀·KDE·Q-Q·박스·상관행렬)은 scipy 참조값 대조 테스트로 검증합니다(총 316개 통과).
  • 통계 분석의 수치 파싱이 통화·퍼센트 접사를 인식하도록 통일되어(₩1,000·25%), 결과창과 차트가 항상 같은 데이터를 봅니다.

✨ v1.13.0 신규 — 기본통계 확장 · 타입 수동 변경 · SQLite · SAS 값 라벨

  • 기본통계 대폭 확장 — 분석 메뉴에 기술통계(N·결측·평균·표준편차·표준오차·95% 신뢰구간·사분위·범위·IQR·최빈값·왜도/첨도·변동계수, 다중 컬럼 일괄), 빈도분석(빈도·백분율·누적%), 일원배치 분산분석(ANOVA)(F·자유도·p·효과크기 η²), 정규성 검정(Shapiro-Wilk) 을 추가했습니다. 통계량·p값은 scipy와 대조해 검증했습니다(기존 상관·t검정·카이제곱에 더해).
  • 컬럼 타입 수동 변경 — 컬럼 헤더 우클릭 ▸ 타입 변경으로 자동 추론을 덮어씁니다. 데이터 무결성을 위해 전환을 허용 / 표본 검증 후 허용 / 차단으로 분류하고(예: Float→Integer처럼 손실 가능한 변환은 차단, 문자→날짜는 표본을 검증해 실패 예시와 함께 확인), 언제든 자동 감지로 되돌릴 수 있습니다. 타입을 바꾸면 그 컬럼의 필터·통계·표시가 새 타입으로 재계산됩니다.
  • SQLite(.db/.sqlite/.sqlite3) 열기 — 데이터베이스의 테이블·뷰를 하단 시트 탭으로 열어 CSV처럼 필터·정렬·분석·내보내기를 그대로 씁니다. 원본은 읽기 전용으로만 접근합니다(Microsoft.Data.Sqlite).
  • SAS 값 라벨(.sas7bcat) 지원 — 필드 라벨 표시를 켜면 .sas7bdat 옆의 동반 포맷 카탈로그(<파일명>.sas7bcat 또는 formats.sas7bcat)를 자동으로 찾아 코드를 라벨로 치환합니다(예: 1→Male). 카탈로그 판독은 ReadStat(MIT)의 구현을 순수 관리형 C#으로 포팅해 네이티브 의존성 없이 동작하며, 한국어(CP949·EUC-KR) 인코딩도 처리합니다. (v1.12.1까지 미지원이던 기능입니다. 다만 SAS 카탈로그 포맷 특성상 일부 파일은 판독되지 않을 수 있으며, 그럴 땐 코드값을 그대로 표시합니다.)

🔧 v1.12.1 — SAS 선언 타입 매칭 대칭화

  • SAS 숫자 컬럼도 선언 타입 존중 — 무포맷/일반 숫자 포맷은 Integer/Float로 확정해(예: seq 같은 헤더의 Identifier 오인 방지) SPSS와 동일하게 동작합니다. 날짜 포맷(YYMMDDS 등)은 그대로 날짜로 인식합니다. 실제 임상 .sas7bdat로 검증했습니다.
  • (SAS 값 라벨은 외부 .sas7bcat 카탈로그에 있고 순수 관리형 .NET 리더가 없어 지원하지 않습니다 — 문자 컬럼은 저장된 텍스트를 그대로 표시.)

✨ v1.12.0 신규 — SPSS·SAS 선언 타입 매칭 + 타입 확장

  • 선언된 변수 타입을 자동 매칭 — SPSS·SAS 파일에 지정된 컬럼 타입(통화·퍼센트·날짜·범주·순서형)을 추론 대신 파일 명시대로 표시합니다. 예: 값 라벨이 붙은 코드 컬럼은 범주형, DOLLAR/PCT 포맷은 통화/퍼센트로 인식하고, 숫자로 선언된 id는 Identifier로 오인하지 않습니다.
  • 타입 4종 추가 — Currency·Percent·Ordinal·Scientific. 통화는 ₩ $ ¥/元 €/£ 기호를 인식하며, 통화·퍼센트 열은 그리드에 기호(₩1,000·25%)를 함께 표시합니다(정렬·통계·필터는 밑값 숫자로 동작).
  • CSV에서도 ₩1,000·25%·1.2e3 같은 값을 통화·퍼센트·지수로 자동 추론합니다.

🔧 v1.11.1 — 필드 라벨 툴바 버튼

  • 필드 라벨 표시 전환 툴바 버튼 추가 — 타입 배지 버튼 왼쪽에 위치하며 보기 메뉴 토글과 동기화됩니다. SPSS·SAS일 때만 활성(그 외 파일에선 회색). 배지 버튼과 구별되는 초록 태그 아이콘.

✨ v1.11.0 신규 — SPSS·SAS 필드 라벨 표시

  • 필드 라벨 토글 — 보기 ▸ 필드 라벨 표시로 SPSS·SAS 파일의 변수 라벨을 헤더로, SPSS는 값 라벨로 코드를 치환(예: 1→남)해 봅니다. 끄면 원값·변수명으로 돌아갑니다(기본값). 선택은 저장되어 다음 열기의 기본값이 됩니다.
  • SAS는 파일에 값 라벨이 없어(포맷 카탈로그는 별도) 변수 라벨(헤더)만 적용됩니다. SPSS 날짜 변수는 원값 모드에서도 날짜로 표시됩니다.
  • (R .rds/.RData는 순수 관리형 리더가 없어 별도 검토 예정입니다.)

✨ v1.10.0 신규 — SPSS(.sav) 열기

  • SPSS 데이터 파일(.sav) 지원 — 파일을 열면 데이터셋을 자동으로 읽어 CSV처럼 필터·정렬·타입 배지·패싯·내보내기를 그대로 사용합니다. 엑셀·SAS와 동일하게 임시 CSV로 변환해 기존 엔진에 얹으며, Curiosity.SPSS(MIT, 순수 관리형)를 사용합니다.
  • 현재는 원값(코드) 을 표시해 타입 추론을 보존합니다. Value Label 펼치기·Variable Label 노출·날짜 변수 디코딩은 후속(Phase 2)으로 계획되어 있습니다.

🐞 v1.9.1 — 도움말 갱신·버전 정보 연동

  • 사용법(F1)·정보 창 내용을 최신 기능(엑셀·SAS·SPSS 열기, 타입 인식 필터, 칩 바, 패싯 패널)으로 갱신.
  • 정보 창에 버전·릴리즈 날짜를 자동 표시 — release.ps1이 빌드 시 버전과 날짜를 어셈블리 메타데이터에 함께 주입(-p:Version·-p:ReleaseDate)하고, 정보 창은 AppInfo로 이를 읽습니다. 표시되는 정보가 실제 릴리즈한 버전/날짜와 항상 일치하며 수동 편집이 필요 없습니다.

✨ v1.9.0 신규 — 엑셀·SAS 열기 (멀티시트)

  • 엑셀(.xlsx/.xls)·SAS(.sas7bdat) 지원 — 파일을 열면 시트/데이터셋을 자동으로 읽어 들이고, 멀티시트 워크북은 하단 시트 탭으로 전환합니다. 열린 뒤에는 CSV와 동일하게 필터·정렬·타입 배지·패싯·내보내기를 모두 사용할 수 있습니다.
  • 내부적으로 각 시트를 임시 CSV로 변환해 기존 엔진에 얹는 방식이며, 엑셀은 ExcelDataReader, SAS는 SasReader(EPAM parso 포팅)를 사용합니다. (대용량 바이트 오프셋 즉시열람은 여전히 CSV/TXT 전용입니다.)

🐞 v1.8.1 — 필터 칩 바 수정

  • 활성 필터 칩 바를 툴바 아래 별도 띠로 도킹해, 칩이 그리드 컬럼 헤더를 덮던 문제를 해결.
  • 칩 높이가 비정상적으로 커지던 레이아웃 버그 수정(고정 크기 렌더링).
  • 칩 바 배경을 앱 기본 테마색으로 맞추고, 모두(AND)/하나라도(OR) 토글 높이를 칩과 일치.

✨ v1.8.0 신규 — 타입 인식 필터링·패싯 분석

  • 컬럼 타입 확장 — 기존 INT/FLT/DATE/BOOL/CAT/STR에 더해 **DateTime·Time·Identifier**를 자동 추론합니다. 2024-01-01 14:30은 DateTime, 14:30:00은 Time으로 구분하고, yyyyMMdd 컴팩트 날짜는 헤더와 무관하게 날짜로 인식합니다(연도 1900~2100 가드). 식별자(선행 0 숫자·id/번호/코드 헤더)는 수량이 아니므로 평균 등 무의미한 수치 통계를 자동 억제합니다.
  • 전 타입 헤더 필터 — Empty를 제외한 모든 컬럼에 타입별 필터를 제공합니다: 숫자·시간계열은 범위(min~max, 시각 정밀도 인식), 범주·불리언은 체크박스, 문자열·식별자는 텍스트 술어(포함·일치·시작·끝·정규식·빈값·목록 붙여넣기). 고유값이 적은 숫자 컬럼은 범위 대신 체크박스로 폴백합니다.
  • 활성 필터 칩 바 — 모든 활성 조건을 그리드 위 칩으로 표시하고, 각 칩의 ✕로 개별 제거·클릭으로 재편집합니다. 조건이 둘 이상이면 모두(AND)/하나라도(OR) 결합 토글을 제공하며, 결합 방식은 저장된 뷰에 함께 저장됩니다. 중첩 부울 (A AND B) OR C는 고급 식 필터로 표현할 수 있습니다.
  • 패싯 분석 패널(F6) — 우측 패널에서 컬럼별 분포를 한눈에: 숫자는 히스토그램, 그 외는 상위 값 빈도를 가로 막대로 표시합니다. 막대를 클릭하면 그 구간/값으로 즉시 필터되고, 필터가 바뀌면 분포가 다시 계산됩니다(크로스필터링).

✨ v1.7.0 신규 — 분석·탐색·생산성

  • 고급 검색 — 평문(contains)에 더해 정규식(/패턴/ 또는 regex:)과 퍼지(fuzzy:) 검색을 지원합니다.
  • 표현식 필터 — age > 30 AND city = "서울" 처럼 AND/OR/괄호와 비교 연산을 쓰는 고급 필터(Edit ▸ Advanced Filter).
  • 헤더 타입 배지 — 인덱싱이 끝나면 컬럼명 옆에 추론 타입(INT/FLT/DATE/BOOL/CAT/STR)을 컬러 배지로 표시(보기 메뉴·툴바에서 켜고 끄기).
  • 헤더 필터 — 범주형/날짜 컬럼 헤더 우측의 깔때기로 값 체크박스(검색·개수)·날짜 범위 필터를 적용합니다(정렬과 분리).
  • 내보내기 — 현재 보기(필터·정렬·표시 컬럼)를 CSV / Markdown / JSON / HTML로 스트리밍 내보내기.
  • 분석 — 수치 분포(분위·히스토그램), 날짜 히스토그램(일/주/월/년), 중복 탐지, 그룹별 집계(Count/Sum/Mean/… ).
  • 통계 — 상관(Pearson/Spearman), 독립·대응 t검정, 카이제곱 검정(정확한 p값·신뢰구간).
  • 피벗 빌더 + 차트 — 행/열/값/필터에 필드를 배정하는 엑셀식 피벗(다중 측정·날짜 그룹핑·합계)과 외부 라이브러리 없는 GDI+ 차트(막대/묶은막대/누적/꺾은선). 피벗 메뉴에서 표/차트로 진입.
  • 엑셀식 셀 선택·복사 — 드래그 사각 선택·Shift/Ctrl 선택, Ctrl+C로 전체 값 TSV 복사, 우클릭으로 행/열 전체 복사, 상세 패널 TEXT/JSON 복사.
  • 저장된 뷰 — 필터·정렬·숨김 컬럼·검색·컬럼 필터를 파일별로 저장/복원.
  • 가져오기 편의 — 클립보드(CSV 텍스트·경로·file://)·드래그앤드롭으로 바로 열기.
  • 성능 대시보드 · 영속 인덱스 캐시 — 처리량·저장 모드 등을 한눈에, 디스크 모드 재열기 시 인덱싱 생략.
  • 셀로 이동(Ctrl+G) · 주소 상자 · 컬럼 숨기기 — 그리드 위쪽의 주소 상자는 엑셀 이름 상자처럼 직접 입력할 수 있습니다: 120(행 머리글 번호), R120C3(120행 3열), C3(3열만), 이름:120 또는 [이름]120(컬럼 이름 + 행), 이름:(컬럼만). Enter로 이동하고 선택하며, 잘못된 입력·없는 컬럼·필터로 걸러진 행은 상태 표시줄에 이유를 알립니다. Ctrl+G 대화상자도 같은 문법입니다. 컬럼 표시/숨김 체크리스트.
  • 조건부 서식 — 보기 ▸ 조건부 서식…(또는 셀 우클릭): 규칙은 "조건(고급 필터 식: 정규식·NOT·* 포함) → 셀(지정한 컬럼) 또는 행 전체에 배경색·글자색·굵게" 또는 "숫자 컬럼 색상 눈금(2색/3색, 최소·최대는 현재 보기 기준으로 한 번 계산)"입니다. 목록 순서가 우선순위이며 배경·글자색·굵게를 각각 처음 맞은 규칙이 정합니다(위/아래 버튼으로 순서 변경, 체크로 켜고 끔, 편집 중 앞 10,000행의 일치 수 미리보기). 편집한 셀(앰버)·추가 컬럼 값(파랑)·삽입 행(초록) 강조가 규칙의 배경보다 우선하고 규칙의 글자색·굵게는 유지됩니다. 보이는 행만 계산하고(행 단위 캐시, 편집·필터 때 무효화) 정규식이 250ms를 넘긴 행은 "일치하지 않음"으로 세어 상태 표시줄에 알립니다. 규칙은 컬럼 이름으로 컬럼을 가리키며 파일별 저장 뷰(%LOCALAPPDATA%\NanumCsvViewer\views)에 자동 저장되어 다시 열면 적용됩니다(컬럼을 삭제·이름 변경하면 그 규칙은 적용되지 않고 관리 창에 표시). 에이전트도 같은 규칙을 만들고 지울 수 있습니다.

🧰 기술 스택

항목 내용
런타임 .NET 10 (net10.0-windows)
UI Windows Forms
CSV 엔진 외부 라이브러리 없이 직접 구현(SIMD 바이트 스캐너 + span 파서)
인코딩 CodePagesEncodingProvider로 CP949/EUC-KR(코드페이지 949) 지원

개발 계획: 공통 C# 엔진 + macOS Eto.Forms. Windows UI 유지, 엔진 분리, 대용량 그리드 검증, 기능 이식·서명 배포의 단계와 완료 기준을 정리했습니다. Windows에서 여는 Eto 뷰어는 dotnet run --project NanumCsvViewer.Eto -c Release입니다. macOS 빌드·서명 검증은 아직 진행하지 않았습니다.

🚀 빌드 & 실행

요구 사항: .NET 10 SDK, ALGLIB Commercial for C# 배포본(라이선스 보유자 전용)

  • ALGLIB 배포본을 ExternalLibs/ALGLIB/에 풀어 둡니다(ExternalLibs/ALGLIB/alglib-csharp/lib-csharp-core/src/*.cs를 NanumCsvViewer.Alglib 프로젝트가 컴파일). 라이선스상 소스를 공개 배포할 수 없어 이 폴더는 .gitignore 대상이며, 없으면 빌드가 안내 메시지와 함께 실패합니다. 게시(단일 exe)에는 컴파일된 ALGLIB가 포함되어 추가 파일이 없습니다.
# 빌드
dotnet build -c Release

# 실행
dotnet run --project NanumCsvViewer -c Release

# 테스트(CSV 파서·인덱서·인코딩 감지 등 단위/통합 테스트)
dotnet test

📦 단일 실행 파일 만들기

릴리즈는 Portable과 Install 두 가지로 배포합니다(둘 다 프레임워크 의존 — 앱에 .NET 미포함).

산출물 형태 요구사항
Portable …-portable.exe — 설치 없이 실행하는 단일 exe .NET 10 Desktop Runtime (x64) (없으면 Windows가 안내)
Install …-setup.exe — 시작 메뉴 등록·제거 지원 설치 관리자 설치 중 .NET 10을 점검해 없으면 자동 설치

앱 빌드는 win-x64-framework 게시 프로필을 사용하고, 설치 관리자는 installer/NanumCsvViewer.iss(Inno Setup)로 만듭니다. (.NET을 포함한 자체 포함본이 필요하면 win-x64-singlefile 프로필로 별도 게시할 수 있습니다.)

릴리즈 + 코드 서명

scripts/release.ps1이 게시 → 앱 exe 서명 → Portable 복사 → 설치 관리자 컴파일 → setup 서명 → 설치된 exe 서명 검증(임시 무인 설치·제거) → GitHub 릴리즈까지 수행합니다.

  • 기본적으로 x64·arm64 두 아키텍처를 모두 빌드·서명하고 한 릴리즈에 함께 업로드합니다. 한쪽만 만들려면 -Arch x64 또는 -Arch arm64.
  • Portable·setup·설치되는 앱 exe 모두 SafeNet 토큰의 EV 인증서로 서명·타임스탬프됩니다. (페이로드를 먼저 서명한 뒤 패키징하므로, Inno Setup이 바이트 보존하여 설치된 exe의 서명이 유지됩니다.)
  • -p:Version으로 바이너리 파일버전을 릴리즈 버전과 자동 일치시킵니다.
  • 서명 시 토큰 PIN 프롬프트가 뜹니다(연속 서명은 SafeNet single-logon 권장). 동일 버전 재실행 시 기존 릴리즈에 자산을 덮어씁니다.
# 토큰 연결 상태에서 실행(코드사이닝 인증서 자동 선택)
.\scripts\release.ps1 -Version 1.14.0

# 빌드/컴파일만(서명·검증·릴리즈 생략)
.\scripts\release.ps1 -Version 1.14.0 -SkipSign -SkipRelease

요구: .NET SDK, Inno Setup 6.3+ (winget install JRSoftware.InnoSetup), Windows SDK(signtool), SafeNet Authentication Client, GitHub CLI(gh auth login).

📖 사용법

  1. File ▸ Open(또는 툴바 Open)으로 .csv / .txt 파일을 엽니다.
  2. 하단 진행바가 끝나면(또는 진행 중에도) 자유롭게 스크롤합니다.
  3. 인코딩: 상태바 우측(신호등 왼쪽)의 인코딩 표시를 클릭해 바꿉니다(자동 감지가 틀린 경우). View ▸ 인코딩 메뉴로도 가능합니다.
  4. Find: 검색어 입력 후 Enter → 다음 일치로 이동.
  5. Filter: 컬럼 선택 + 검색어 → Apply. 셀을 선택한 뒤 Filter by Cell(또는 우클릭 ▸ "이 셀 값으로 필터")로 그 값 조건을 추가하면 기존 필터에 AND로 누적됩니다. Clear로 전체 해제.
  6. 정렬: 컬럼 헤더 클릭(다시 클릭 시 내림차순).
  7. 상세 패널: 시작할 때는 꺼져 있습니다(AI 패널만 켜짐). 툴바의 행 상세 패널 버튼, 보기 ▸ 행 상세 패널 또는 F4로 켜고 끌 수 있고(폭 드래그 확장), 설정 ▸ 패널과 배치에서 시작 때 켜 둘 수 있습니다. 선택한 행 전체를 컬럼명+값으로 보여줍니다.
  8. 상태 표시등: 상태바 우측 끝 색 점으로 진행/준비 상태를 확인합니다(🟢 준비 완료).

처음 설치한 PC에서 AI 채팅 준비

AI 채팅은 ① Microsoft Edge WebView2 런타임 ② omp(oh-my-pi, 18.4.4 이상) ③ 모델 제공자 로그인이 있어야 동작합니다. 나머지 뷰어 기능은 이 셋이 없어도 그대로 씁니다. 준비가 안 된 PC에서는 AI 패널이 시작하지 못할 때 AI 환경 설정 도우미가 앱 버전마다 한 번 저절로 열립니다. 직접 열려면 도구 ▸ AI 환경 설정 도우미…(또는 설정 ▸ AI 에이전트의 같은 단추)를 누르세요.

  1. WebView2 — 런타임이 없으면 [런타임 설치 페이지 열기]로 설치하고 [다시 시도]를 누릅니다. DPI 호환성 설정이 원인이면 [DPI 호환성 설정 해제](현재 사용자 항목만, 백업 .reg 자동 저장) 뒤 [다시 시도]를 누릅니다.
  2. omp — 못 찾으면 [찾아보기…]로 omp.exe를 고르거나, 다운로드 폴더 등에서 찾은 omp-windows-x64.exe를 [이 파일 설치]로 복사하거나, [omp 내려받기]로 GitHub 최신 릴리스를 받습니다(SHA-256 검증, %LOCALAPPDATA%\omp\omp.exe에 설치). 터미널에서도 omp를 쓰려면 '사용자 PATH에도 추가'를 켜세요.
  3. 로그인 — 모델 제공자를 골라 [로그인]을 누르면 브라우저에 인증 페이지가 열립니다. 끝나면 모델 개수가 표시됩니다. API 키 방식 제공자는 제공자 환경 변수를 설정하고 앱을 다시 시작하거나 터미널에서 omp login을 실행합니다.
  4. 연결 시험 — 자동으로 확인됩니다(모델에는 아무것도 보내지 않음). 네 단계가 모두 정상이면 AI 패널(Ctrl+Shift+A)에서 바로 쓸 수 있습니다.

그래도 안 되면 도움말 ▸ AI 환경 진단 정보 복사로 상태를 복사해 문의에 붙여 넣으세요(사용자 이름·키·토큰은 가려지고 데이터 내용은 들어가지 않습니다).

⌨️ 단축키

단축키 기능
Ctrl+O 열기
Ctrl+W 탭 닫기(가운데 클릭도 가능)
Ctrl+Shift+N 새 작업 공간…
Ctrl+Shift+O 작업 공간 열기(.ncvws)
Ctrl+S 작업 공간 저장
Ctrl+Q 종료
Ctrl+Z 되돌리기
Ctrl+Y / Ctrl+Shift+Z 다시 실행
Ctrl+C 선택한 셀 복사(TSV)
Ctrl+V 셀 붙여넣기(시트 편집 모드)
Del 선택한 셀 지우기(시트 편집 모드)
F2 셀 편집
Ctrl+Shift+E 시트 편집 모드
Ctrl+H 찾아 바꾸기(정규식)
Ctrl+F 찾기(검색창으로 포커스 이동)
F3 / Enter(검색창) 다음 찾기
Enter(필터창) 필터 적용
Ctrl+B 이 셀 값으로 필터(AND 누적)
Ctrl+Shift+F 고급 필터
Ctrl+Shift+L 필터 해제
Ctrl+Alt+S 정렬 해제
Ctrl+G 셀로 이동(행 번호 · R12C3 · C3 · 이름:12)
F4 행 상세 패널
F6 패싯 패널
Ctrl+Shift+A AI 에이전트 패널
Ctrl+Shift+W 작업 공간 탐색기
Ctrl+Tab / Ctrl+Shift+Tab 다음 / 이전 탭
Ctrl+Shift+Q 품질 프로파일 실행
Ctrl+Alt+Q 새 질의(SQL 편집기)
Ctrl+, 설정
F1 사용법 도움말

모든 기능은 메뉴(파일 · 편집 · 보기 · 데이터 · 작업 공간 · 통계 · 시각화 · 품질 · 도구 · 도움말) 와 툴바, 우클릭 메뉴에서 접근할 수 있습니다. 단축키 전체 목록은 **도움말 ▸ 단축키…**에도 있습니다.

정렬

  • 단일 컬럼: 컬럼 헤더 클릭(다시 클릭 시 오름↔내림 토글), 또는 Sort ▲ / ▼ 툴바 버튼·데이터 메뉴(현재 셀의 열 기준). 정렬 해제는 Ctrl+Alt+S.
  • 다중 컬럼: 헤더를 Shift+클릭하면 정렬 차수가 누적됩니다(1차, 2차, 3차…). 예: 이름 클릭 후 나이 Shift+클릭 → 이름 오름차순, 동률이면 나이로 정렬. 활성 컬럼에는 정렬 화살표가, 다중일 때는 우선순위 번호가 헤더에 표시됩니다.
  • 같은 키 값을 가진 행끼리는 원본 파일 순서가 유지됩니다(안정 정렬). 숫자처럼 보이는 컬럼은 수치 기준으로 정렬합니다.
  • 필터 조건을 바꾸면 정렬이 초기화됩니다(필터를 더 좁히는 경우는 순서 유지).

여러 파일 작업 공간 사용법

  1. 파일을 여러 개 열면 각각 탭이 됩니다. 보기 ▸ 작업 공간 탐색기(Ctrl+Shift+W)에서 원본·테이블·뷰를 확인합니다(시작할 때는 꺼져 있으며, 작업 공간 파일을 열면 그 파일에 저장된 배치로 복원됩니다).
  2. 조인·이어 붙이기·비교·그룹 마법사로 뷰를 만들거나, 작업 공간 ▸ 새 질의(Ctrl+Alt+Q)에서 SELECT를 직접 씁니다. 한글·공백 이름은 "…"로 감쌉니다: SELECT "이름" FROM "설문_명단".
  3. 열 타입은 자동 판정된 값이고 변환 안 되는 값은 NULL입니다. 원본 텍스트가 필요하면 "T__raw"를 씁니다.
  4. 작업이 끝나면 파일 ▸ 작업 공간 저장(Ctrl+S)으로 .ncvws에 보관합니다(데이터가 아닌 원본 경로·뷰 정의와 패널 배치). 작업 공간 메뉴에는 파일 추가·바뀐 파일 다시 읽기·마법사·메모가 있습니다.

⚙️ 동작 원리(요약)

핵심은 "전부 읽지 않는다"입니다.

  1. 파일을 한 번 순차 스캔하며 각 레코드의 시작 바이트 오프셋만 인덱싱합니다.
  2. 화면에 보이는 행만 오프셋으로 찾아 읽고, 선택된 인코딩으로 디코딩·파싱해 LRU 캐시에 둡니다.
  3. EUC-KR/CP949/UTF-8에서는 줄바꿈·구분자·따옴표 바이트가 멀티바이트 문자 중간에 나타나지 않으므로, 바이트 단위 스캔이 인코딩과 무관하게 안전합니다(따옴표 안 줄바꿈도 정확히 처리).

⚠️ 제한 사항

  • 엑셀(.xlsx/.xls)·SAS(.sas7bdat)·SPSS(.sav)·SQLite(.db/.sqlite/.sqlite3)는 열 때 시트/데이터셋/테이블별 CSV로 변환해 지원합니다(시트 탭으로 전환). 단, 바이트 오프셋 대용량 즉시열람은 CSV/TXT 전용입니다.
  • 작업 공간: 뷰 새로 고침 시 그 탭의 필터·정렬이 초기화되고, 뷰는 읽기 전용이며, 식별자성 열은 텍스트(숫자 비교는 CAST), CSV 스캔은 단일 스레드(열 수가 다른 행 허용), DB 원본은 앱이 다시 가져올 때만 갱신, 포터블 exe는 DuckDB 때문에 x64 약 48 MB, 뷰가 쓰는 원본의 이름 바꾸기·제거는 거부됩니다.
  • 창 위치는 컴퓨터마다 달라 .ncvws에 저장하지 않습니다(패널 배치만 저장).
  • UTF-16/UTF-32는 대용량 모드에서 지원하지 않습니다(BOM 감지 시 안내).
  • 매우 느린 HDD에서 디스크 모드(>약 1.5 GB)일 때 스크롤에 미세한 지연이 있을 수 있습니다.
  • 모델 선택기의 '최근 사용'(v3.3.2): omp가 내부 DB(agent.db의 model_usage)에 적어 둔 기록을 읽기 전용으로 쓰므로 omp 내부 형식이 바뀌면 읽지 못할 수 있습니다(그때는 채팅에 한 번 알리고 전체 목록만 보입니다). omp 18.4.4에서 확인한 바로는 이 기록은 모델을 바꿀 때(RPC set_model, 즉 앱의 모델 선택) 갱신되고, 기본 모델로 프롬프트만 보내는 것(omp -p로 확인)은 기록하지 않습니다. 이 앱이 읽는 폴더는 ~/.omp/agent(또는 PI_CODING_AGENT_DIR·--profile/OMP_PROFILE이 가리키는 곳)이며, .env 파일로만 바꾼 위치는 따라가지 못합니다.
  • 분석 스킬·Python 분석(v3.3.0): 스킬은 제3자(K-Dense) 안내문이라 에이전트가 따르는 것은 지시일 뿐 강제가 아닙니다(일부 스킬 원문의 uv pip install·네트워크 안내는 앱 가이드가 금지하지만 기술적으로 막지는 않습니다). 에이전트가 csv.run_analysis로 직접 실행하는 것은 기술통계·GLM·ANCOVA·GLzM·로지스틱뿐이고, 나머지 앱 분석은 사용자가 메뉴에서 실행해야 합니다. 스킬 선택은 앱 전체 설정이며 작업 공간 파일에는 저장되지 않습니다. 관리형 환경은 Windows 64비트 Intel/AMD(win_amd64)·Python 3.10~3.13만 지원하고(ARM64·32비트 거절), scikit-survival은 Python 3.13에서 설치되지 않습니다. '요약만' 정책 + 로컬 Python 조합은 Python 출력이 모델로 갈 수 있어 설정에 경고가 나오는데, 이는 안내일 뿐 하드 보장이 아닙니다. Python 분석 결과는 앱 검증 범위 밖입니다.
  • 채팅 + 첨부(v3.3.4): 칩은 "다음 메시지에 이 표들이 있다"는 표시일 뿐 파일 내용을 보내지 않으며, 에이전트가 ws.* 도구로 읽을 때만 기존 데이터 정책·승인 규칙이 적용됩니다. 칩을 단 뒤 작업 공간에서 그 원본을 제거하면 칩은 그대로라서 에이전트의 도구 호출이 표를 찾지 못해 실패할 수 있습니다(보낼 때 다시 검사하지 않음). 끌어놓기는 WebView2가 넘기는 파일 객체의 경로를 쓰므로 브라우저가 경로를 주지 않는 항목(예: 가상 파일)은 건너뜁니다. 폴더는 하위 폴더를 훑지 않고, 파일 대화 상자의 형식 필터는 입력한 이름에 적용되지 않아 모든 파일을 고를 수 있지만 지원하지 않는 형식은 올리지 않고 알립니다. 머리말 줄을 칩으로 되돌리는 파서는 표 이름에 공백이 없다는 작업 공간 규칙에 기대므로, 읽지 못하는 머리말은 글자 그대로 보입니다.
  • AI 환경 설정 도우미·omp 설치(v3.4.0): 내려받기는 GitHub 최신 정식 릴리스의 omp-windows-x64.exe/arm64.exe만 쓰고, 릴리스가 SHA-256을 공개하지 않거나 값이 다르면 설치하지 않습니다. 특정 버전을 고르거나 자동으로 업데이트하는 기능은 없으니 다른 버전이 필요하면 직접 받아 [찾아보기…]/[이 파일 설치]를 쓰세요. omp는 코드 서명이 되어 있지 않아 Windows SmartScreen·보안 프로그램이 경고하거나 막을 수 있고, 그때는 앱이 우회할 수 없습니다. omp.ps1(PowerShell 래퍼)만 있는 PC는 omp.exe/.cmd가 필요합니다. 대상 omp.exe가 실행 중이면 바꿀 수 없으니 AI 채팅을 닫고 다시 시도하세요. 로그인은 OAuth 방식 제공자만 도우미에서 진행하고, API 키처럼 비밀 값을 입력해야 하는 제공자는 터미널(omp login)이나 환경 변수가 필요합니다. 도우미는 omp의 RPC(get_login_providers·get_available_models·login)에 기대므로 omp 쪽 형식이 바뀌면 단계가 실패로 표시될 수 있습니다.
  • WebView2·DPI(v3.4.0): DPI 모드가 Per-Monitor V2로 바뀌어 HIGHDPIAWARE 레이어가 걸린 PC에서도 채팅이 시작되지만, DPIUNAWARE·GDIDPISCALING 레이어는 여전히 초기화를 막습니다. [설정 해제]는 현재 사용자(HKCU) 항목만 지울 수 있고, HKLM(모든 사용자) 항목은 관리자 권한으로 직접 해제해야 합니다. 배율이 다른 여러 모니터·150% 이상 배율에서의 화면 배치는 개발 PC(100%)에서 검증하지 못했습니다. 진단 정보의 가리기는 패턴 기반이라 모르는 형식의 비밀 값은 못 가릴 수 있습니다.
  • 패널 머리글·분할선(v3.4.1): 머리글 높이(30)와 분할선 폭(5)은 논리 px이고 선은 장치 1px로 그립니다. 개발 PC(100% 배율)에서만 화면으로 측정해 세 머리글이 같은 높이(30px)임을 확인했고, 125%·150% 같은 배율에서는 웹 페이지의 CSS px 반올림 때문에 채팅 상단 바가 1px 어긋날 수 있습니다(미검증). 검사 결과·패싯 패널 안쪽 목록의 자체 테두리는 분할선과 맞닿지 않아 그대로 두었습니다.

📝 라이선스

개인 프로젝트입니다. 별도 라이선스 명시 전까지 모든 권리는 작성자에게 있습니다.

제3자 고지: 번들 분석 스킬은 K-Dense-AI/scientific-agent-skills v2.72.0(MIT)에서 가져왔습니다. 고지문과 MIT 전문은 소스의 NanumCsvViewer/Agent/Skills/THIRD_PARTY_NOTICES.md·LICENSE-K-Dense-scientific-agent-skills.txt, 앱에 내장된 ChatAssets/NOTICE.txt 4절, 그리고 스킬을 푼 폴더(%LOCALAPPDATA%\NanumCsvViewer\skills\…\sel-…\)에 들어 있습니다. 앱 정보 창에는 라이선스 목록이 없습니다.

About

윈도우11용 고성능 CSV 파일 뷰어

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages