CSV를 표로 변환


15

도전

CSV 입력이 있으면 상자 문자를 사용하여 적절한 유니 코드 테이블을 출력하십시오.

서식

테이블은 다음 규칙을 사용하여 형식이 지정됩니다.

  • 열 너비는 해당 열의 가장 긴 값과 같습니다.
  • 모든 테이블 데이터는 정당한 상태로 유지됩니다
  • 각 테이블은 첫 번째 CSV 행을 헤더로 가정합니다.
  • 표는 테두리에 다음 문자를 사용합니다.

┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘ ─ │

Input:
Name,Age,Gender
Shaun,19,Male
Debra,19,Female
Alan,26,Male
George,15,Male

Output:
┌──────┬───┬──────┐
│Name  │Age│Gender│
├──────┼───┼──────┤
│Shaun │19 │Male  │
│Debra │19 │Female│
│Alan  │26 │Male  │
│George│15 │Male  │
└──────┴───┴──────┘

규칙

  • 표준 허점 적용
  • 당신은 전체 프로그램, 기능 또는 람다를 제출할 수 있습니다
  • 입력은 파일, 프로그램 인수 또는 수용 가능한 다른 방법으로 가능합니다.
  • 출력은 파일, 반환 또는 허용되는 다른 대안이 될 수 있습니다.
  • CSV 입력은 내 예제에서 사용한 것과 동일한 형식이어야합니다.
  • 바이트 단위의 최단 답변이 이깁니다.

CSV 입력은 다음과 같은 형식이어야합니다.

Header1,Header2,Header3 newline
Column1,Column2,Column3 newline
Column1,Column2,Column3 optional_newline

2
CSV 정의를 사용할 수있는 기본적으로 두 가지 방법이 있다고 생각합니다. 문제의 흥미로운 부분이 출력 인 경우, "쉼표로 나누기"처럼 간단하게 만들 수 있으며 쉼표를 인용하는 방법과 인용 부호를 인용하는 방법에 대해 걱정할 필요가 없습니다. 그렇지 않으면 CSV를 구문 분석하는 특정 방법을 명시 할 수 있습니다 ( "큰 따옴표는 쉼표가 무시되는 모드를 전환하고 행에 두 개의 큰 따옴표는 리터럴 큰 따옴표를 생성합니다")는 매우 일반적인 것입니다. 현존하는).

4
오류, 심각한 문제 : 승리 조건을 지정하지 않았습니다. 최적화 된 프로그램은 무엇입니까? 길이 ( 코드 골프 )?

1
적어도 처음 세 개의 링크는 모두 CSV를 다르게 정의합니다 (그리고 적어도 두 개는 서로 다른 방법이 많이 있다고 말합니다). 따라서 질문에 사용하기 위해 "CSV"를 더 완벽하게 정의해야한다고 가정합니다 (솔루션은 쉼표로 나누고 더 짧을 수 있기 때문에 이스케이프를 처리하지 않아도됩니다).

2
좋아, 모든 사람이 사용하기를 원하는 CSV 형식에 대한 내용을 포함하도록 질문을 편집했습니다.
Shaun Wild

1
CRLF? 진심이야? CR은 텍스트 파일의 다른 것을 의미하는 유닉스에 상당히 큰 형벌을 줄 것입니다. OS 별 줄 바꿈을 사용할 수 있도록 "줄 바꿈"으로 바꾸려고 할 수도 있습니다.

답변:


10

(Dyalog) APL 시도 , 38 43 바이트

마지막 입력 줄에는 후행 줄 바꿈이 있어야합니다.

{{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨',',¨(s1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}

온라인으로 사용해보십시오! Dyalog APL의 오프라인 버전 ]boxing ON -style=min에서 동일한 효과를 위해 실행 하십시오.

설명

{... 인수를 나타내는 }익명 함수 :

¯1 ⌽ ⍵ 후행 줄 바꾸기를 앞쪽으로 회전

(s ←... )함수 정의 이야 다음과 적용

  1 ↓¨ 각각의 첫 번째 문자를 드롭

  ⊢ ⊂⍨ 라인, 분할

  ⊃ = ⊢ 첫 번째 문자는 문자열의 문자와 같습니다

',' ,¨ 그런 다음 각 줄에 쉼표를 추가하십시오

함수 적용 각각 라인

{... }이제 다음 익명 함수를 적용하십시오.

  1 ↓ ⍵ 첫 번째 요소 (행 머리글)를 삭제하십시오.

  ↓ ⍉ ↑ 행 목록을 열 목록으로 전치

  ↑¨ 각 요소 (항목 목록)를 채워진 항목의 행렬로 만듭니다.

  ⍉ ⍪ 1 열 행렬로 만든 다음 1 행 행렬로 바꿉니다.

  (⊃⍵) ⍪ 인수의 첫 번째 요소 (헤더 목록)를 맨 위에 놓습니다.

참고 : 선 그리기 문자는 솔루션에서 명시 적으로 사용되지 않지만 APL 문자 세트의 일부이며 단일 바이트로 계산됩니다.


위의 의견보기Is input using list or array of strings (and no newlines) valid? Nope.
edc65

@ edc65 수정되었습니다. 감사.
Adám

아, 박스형 디스플레이는 확실히 편리합니다 :)
Ven

2

PowerShell 3+, 365 바이트

$d=$input|ipcsv
$h=$d[0].PSObject.Properties.Name|%{$_|Add-Member -type NoteProperty -na c -v(($d.$_+$_|measure Length -ma).Maximum)-pa}
"┌$(($h|%{'─'*$_.c})-join'┬')┐"
"│$(($h|%{$_.PadRight($_.c)})-join'│')│"
"├$(($h|%{'─'*$_.c})-join'┼')┤"
$d|%{$i=$_;"│$(($h|%{$i.$_.PadRight($_.c)})-join'│')│"}
"└$(($h|%{'─'*$_.c})-join'┴')┘"

나는 이것이 많이 향상 될 수 있다고 생각하지만 시간이 부족합니다. 모든 줄 끝은 \nno \r이고 인코딩은 BOM이없는 UTF8입니다.


1

라켓 578 바이트

(let*((ll(map(λ(x)(string-split x","))ll))(lr list-ref)(sl string-length)(d display)(dl displayln)(nc(length(lr ll 0)))
(nl(for/list((i nc))(apply max(for/list((j ll))(sl(lr j i))))))(pl(λ(sy)(d(lr sy 0))(for((n nc))(for((m(lr nl n)))(d(lr sy 1)))
(if(< n(sub1 nc))(d(lr sy 2))(dl(lr sy 3))))))(g(λ(i n)(for((m(-(lr nl n)(sl i))))(d" ")))))(pl'("┌""─""┬""┐"))
(for((i(lr ll 0))(n(in-naturals)))(d"│")(d i)(g i n))(dl"│")(pl'("├""─""┼""┤"))(for((j(range 1(length ll))))
(for((i(lr ll j))(n nc))(d"│")(d i)(g i n))(dl"│"))(pl'("└" "─" "┴" "┘")))

언 골프 드 :

(define(f1 ll)
 (let* ((ll (map (λ (x)(string-split x ",")) ll))  ; use this to convert csv format to list of lists; 
         (lr list-ref)                    ; make short names of standard fns
         (sl string-length)
         (d display)
         (dl displayln)
         (nc (length (lr ll 0)))          ; number of cols; 
         (nl(for/list ((i nc))            ; get list of max string-length for each column
              (apply max
                     (for/list ((j ll))
                       (sl (lr j i))
                       ))))
         (pl (λ (sy)                      ; put lines using sent symbol list
               (d (lr sy 0)) 
               (for ((n nc))
                 (for ((m (lr nl n))) (d (lr sy 1)))
                 (if (< n (sub1 nc))
                     (d (lr sy 2))
                     (dl (lr sy 3))
                     ))))
         (g (λ (i n)                     ; pad with spaces if needed
              (for ((m (- (lr nl n) (sl i)))) (d " ")) ))) 
    ; put line above header: 
    (pl '("┌" "─" "┬" "┐"))

    ; put header: 
    (for ((i (lr ll 0)) (n (in-naturals)))
      (d "│")
      (d i)
      (g i n)
      )
    (dl "│")

    ; put line below header;
    (pl '("├" "─" "┼" "┤"))

    ; put rows: 
    (for ((j (range 1 (length ll))))
      (for ((i (lr ll j))
            (n nc))
        (d "│")
        (d i)
        (g i n)
        )
      (dl "│")
      )

    ; put bottom line: 
    (pl '("└" "─" "┴" "┘"))
    ))

테스트 :

(f (list  "Name,Age,Gender"
          "Shaun,19,Male"
          "Debra,19,Female"
          "Alan,26,Male"
          "George,15,Male"))

산출:

┌──────┬───┬──────┐
│Name  │Age│Gender│
├──────┼───┼──────┤
│Shaun │19 │Male  │
│Debra │19 │Female│
│Alan  │26 │Male  │
│George│15 │Male  │
└──────┴───┴──────┘

1

자바 스크립트 (ES6 | FireFox), 286 바이트

f=>(d=f.split`
`.map(a=>a.split`,`),s=d[0].map((a,i)=>d.reduce((b,c)=>(n=c[i].length)>b?n:b,0)),d=d.map(a=>`│${a.map((b,i)=>b.padEnd(s[i])).join`│`}│`),d.splice(1,0,(g=h=>h[0]+s.map(a=>'─'.repeat(a)).join(h[1])+h[2])('├┼┤')),g('┌┬┐')+`
${d.join`
`}
`+g('└┴┘'))

사용 padEnd파이어 폭스 특정이다.


1
이 288 바이트 아닌가요?
Adám

1
@ Adám ... yes ... 수정 됨
Mwr247

당신이을 많이 사용하지 않습니다 g('└┴┘')에 해당 g└┴┘(후 역 따옴표로 g하고 끝)?
NoOneIsHere 다음

1
padEnd비표준입니다. 필요한 실행 환경을 지정해야합니다.

1
또한 몇 곳에서 쓸 `foo`+bar+`baz`수 있습니다 `foo${bar}baz`. 템플릿을 사용하여 바이트를 저장할 수 있습니다 .

1

자바 스크립트 (ES6), 281 바이트

참고 : OP에서 요청한대로 줄 바꿈이있는 단일 문자열로 입력하십시오. 다른 답변은 문자열 목록을 사용합니다-입력에 문자열 배열을 사용하면 첫 번째 분할을 피하고 9 바이트를자를 수 있습니다.

l=>(l=l.split`
`.map(r=>r.split`,`.map((w,i)=>(v=w.length)<c[i]?w:(c[i]=v,w)),c=[k=0]),l=l.map(r=>r.map((v,i)=>(v+' '.repeat(c[i]-v.length)))),[h=c.map(x=>'─'.repeat(x)),l.shift(),h,...l,h].map(a=>'│┌├└'[j=a!=h?0:++k]+a.join('│┬┼┴'[j])+'│┐┤┘'[j]).join`
`)

덜 골프

l=>(
  // split input in an array of string arrays
  // meanwhile find the column widths and put them in *c*
  l = l.split`\n`.map(r=>r.split`,`.map((w,i)=>(v=w.length)<c[i]?w:(c[i]=v,w)),c=[]),

  // pad each column to the max column width
  l = l.map(r=>r.map((v,i)=>(v+' '.repeat(c[i]-v.length)))),

  // put in *h* the horizontal lines for top,bottom and head separator
  h = c.map(x => '─'.repeat(x) ),

  // add the *h* line at top, bottom and after head line
  l = [h, l.shift(), h, ...l, h],

  // rebuild a string, joining columns with '|' unless the row is *h*
  // if the row is *h* use different characters to join columns
  k = 0, 
  l.map(a=> '│┌├└'[j=a!=h?0:++k] + a.join('│┬┼┴'[j]) + '│┐┤┘'[j])
  .join`\n`  
)

테스트

F=
l=>(l=l.split`
`.map(r=>r.split`,`.map((w,i)=>(v=w.length)<c[i]?w:(c[i]=v,w)),c=[k=0]),l=l.map(r=>r.map((v,i)=>(v+' '.repeat(c[i]-v.length)))),[h=c.map(x=>'─'.repeat(x)),l.shift(),h,...l,h].map(a=>'│┌├└'[j=a!=h?0:++k]+a.join('│┬┼┴'[j])+'│┐┤┘'[j]).join`
`) 
  
function update() {
  O.textContent = F(I.value)
}
update()
#I { width:60%; height: 8em} 
<textarea id=I>Name,Age,Gender
Shaun,19,Male
Debra,19,Female
Alan,26,Male
George,15,Male</textarea><br>
<button onclick='update()'>Go</button>
<pre id=O></pre>


0

파이썬 3, 318 바이트

%형식화 를 사용하는 경우 -3 바이트 , 약어 를 사용하는 경우 -1 바이트str.join

L=[c.split(',')for c in input().split('\n')]
m=[max(len(x)for x in c)for c in zip(*L)]
L=[[""]+[d.ljust(n)for d,n in zip(c,m)]+[""]for c in L]
g=["─"*i for i in m]
J=str.join
print('\n'.join(["┌%s┐"%J("┬",g),J("│",L[0]),"├%s┤"%J("┼",g)]+[J("│",L[i])for i in range(1,len(L))]+["└%s┘"%J("┴",g)]))

따옴표로 묶은 입력이 필요합니다.


1
나에게 318 바이트처럼 보인다.
Adám

1
@ Adám 당신 말이 맞아요, 나는 숯을 보았습니다.
Karl Napf

input()각 통화마다 한 줄만 사용 하므로 작동하지 않습니다 . input()더 이상 회선이 없을 때까지 전화를 걸 거나에서 직접 읽을 수 있습니다 stdin.
movatica

그 외에도 : 292 바이트
movatica

0

C #, 696 바이트

골프 :

string T(string[]f){int w=f.Max(r=>r.Length),a=f.Select(r=>r.Split(',')[0].Length).Max(),b=f.Select(r=>r.Split(',')[1].Length).Max(),c=f.Select(r=>r.Split(',')[2].Length).Max();string o="",n="\r\n",d="",j=string.Concat(Enumerable.Repeat("─",a)),k=string.Concat(Enumerable.Repeat("─",b)),l=string.Concat(Enumerable.Repeat("─",c));Func<string,int,string>z=(q,p)=>{return q.PadRight(p);};d="┌"+j+"┬"+k+"┬"+l+"┐";o+=d+n;var g=f.First().Split(',');o+="|"+z(g[0],a)+"|"+z(g[1],b)+"|"+z(g[2],c)+"|";d="├"+j+"┼"+k+"┼"+l+"┤";o+=n+d+n;for(int i=1;i<f.Length;i++){var h=f[i].Split(',');o+="|"+z(h[0],a)+"|"+z(h[1],b)+"|"+z(h[2],c)+"|"+n;}d="└"+j+"┴"+k+"┴"+l+"┘";o+=d;return o;}

ungolfed (그리고 ^ this는 아무에게도 사용되지 않기 때문에 더 좋습니다) :

public string T(string[] c)
{
  int width = c.Max(r => r.Length),
    longestFirstColumn = c.Select(r => r.Split(',')[0].Length).Max(),
    longestSecondColumn = c.Select(r => r.Split(',')[1].Length).Max(),
    longestThirdColumn = c.Select(r => r.Split(',')[2].Length).Max();

  string o = "", lr = "\r\n", border = "",
    firstColumnFiller = string.Concat(Enumerable.Repeat("─", longestFirstColumn)),
    secondColumnFiller = string.Concat(Enumerable.Repeat("─", longestSecondColumn)),
    thirdColumnFiller = string.Concat(Enumerable.Repeat("─", longestThirdColumn));

  Func<string, int, string> padRight = (a, b) => { return a.PadRight(b); };

  border = "┌" + firstColumnFiller
    + "┬" +
    secondColumnFiller + "┬"
    + thirdColumnFiller
    + "┐";

  o += border + lr;

  var firstRow = c.First().Split(',');

  o += "|" + padRight(firstRow[0], longestFirstColumn) +
    "|" + padRight(firstRow[1], longestSecondColumn) +
    "|" + padRight(firstRow[2], longestThirdColumn) + "|";

  border = "├" +
    firstColumnFiller + "┼" +
    secondColumnFiller + "┼" +
    thirdColumnFiller
    + "┤";

  o += lr + border + lr;

  for (int i = 1; i < c.Length; i++)
  {
    var row = c[i].Split(',');

    o += "|" + padRight(row[0], longestFirstColumn) + "|"
    + padRight(row[1], longestSecondColumn) + "|" +
    padRight(row[2], longestThirdColumn) + "|" + lr;
  }

  border = "└" +
    firstColumnFiller + "┴" +
    secondColumnFiller + "┴" +
    thirdColumnFiller
    + "┘";

  o += border;

  return o;
}

테스트 :

┌──────┬───┬──────┐         ┌──────────┬───────────────────────────┬─────┐
|Name  |Age|Gender|         |Name      |PPCG Challenge             |Votes|
├──────┼───┼──────┤         ├──────────┼───────────────────────────┼─────┤
|Shaun |19 |Male  |         |Pete Arden| Print all integers        | 4   |
|Debra |19 |Female|         |Pete Arden| Yes of course I'm an adult| 3   |
|Alan  |26 |Male  |         |Pete Arden| 5 Favorite Letters        | 1   |
|George|15 |Male  |         └──────────┴───────────────────────────┴─────┘
└──────┴───┴──────┘

어떻게 든, 이것을 계산할 때 697 바이트를 계속 얻습니다.
Adám

@ Adám 방금 다시 확인하면 Golfed 문자열의 길이는 Visual Studio에서 666 열입니다. 그러나 666도 697도 어쨌든 정확하게 경쟁 점수는 아닙니다 :)
Pete Arden

후행 줄 바꿈이 있지만 제거 할 때도 여전히 696 바이트 입니다.
Adám

@ Adám Ah ... 나는 문자 수 / 바이트 수 불일치가 나를 기다리고 있습니다. 이 기호 ( "┼")에서이 재미있는 기호로 알고 있어야합니다. 업데이트, 감사합니다 :)
Pete Arden

위의 의견보기Is input using list or array of strings (and no newlines) valid? Nope.
edc65

0

펄, 273 + 9 ( -CS -nlaF,플래그) = 282 바이트

$v[$.-1]=[@F];map$l[$_]<($l=length$F[$_])&&($l[$_]=$l),0..$#F}sub p{printf$p,@_}sub o{p
pop,map{$\x$l[$_],$_-$#l?$_[0]:pop}0..$#l}$p=join'%s','',(map"\%-${_}s",@l),$/;($\,$c,@c)=map
chr$_*4+9472,0,.5,3..15;o@c[8,1,0];p($c,map{$_,$c}@$_),$i++||o@c[12,6,4]for@v;o@c[10,3,2];{

사용 :

cat file.csv | perl -CS -nlaF, script.pl

Ideone에서 사용해보십시오 .


0

PHP, 313 바이트

for(;$r=fgetcsv(STDIN);$a[]=$r)foreach($r as$x=>$s)$e[$x]=max($e[$x],strlen($s));$t=["┬","┌","┐"];eval($L='foreach($e as$i=>$n)echo$t[!$i],str_repeat("─",$n);echo"$t[2]\n";');foreach($a as$k=>$r){foreach($r as$i=>$s)echo"│",str_pad($s,$e[$i]);echo"│\n";$t=["┼","├","┤"];if(!$k)eval($L);}$t=["┴","└","┘"];eval($L);

고장

for(;$r=fgetcsv(STDIN);$a[]=$r)                         // read csv from STDIN, append to array $a
    foreach($r as$x=>$s)$e[$x]=max($e[$x],strlen($s));  // remember max length in array $e
                                                        // print top border
$t=["┬","┌","┐"];eval($L='foreach($e as$i=>$n)echo$t[!$i],str_repeat("─",$n);echo"$t[2]\n";');
foreach($a as$k=>$r)
{
    foreach($r as$i=>$s)echo"│",str_pad($s,$e[$i]);echo"│\n";   // print row
    $t=["┼","├","┤"];if(!$k)eval($L);                           // print border below header
}
$t=["┴","└","┘"];eval($L);                              // print bottom border

이데온에서 테스트


0

APL (Dyalog Extended) , 36 25 바이트 SBCS

전체 프로그램. ABCDEFGHIJKLMNOPQRSTUVWXYZ이것이 CSV 파일 이라고 가정 합니다. stdout으로 인쇄합니다.

disp(1m)⍪↑¨↓⍉1m←⎕CSVA

온라인으로 사용해보십시오!

⎕A 대문자 lphabet (최단 간 참조 기본 문자열)  행렬에 CSV에서 해당 파일로 변환 판독  로서 저장소 (대한 m의 ATRIX)  첫 번째 행 드롭  전치  컬럼의리스트로 분할  매트릭스로 각 문자열에서 믹스 …  그 위에 다음을  쌓으십시오. 첫 번째 행을  적용하십시오 (선 그리기 문자를 그립니다).
⎕CSV
m←m
1↓


↑¨
()⍪
1↑mm
⌂dispdfns.disp

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.