CSV को तालिका में बदलें


15

चुनौती

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 को पार्स करने की एक विशिष्ट विधि बता सकते हैं ("डबल कोट्स एक मोड को टॉगल करते हैं जिसमें कॉमा को अनदेखा किया जाता है, एक पंक्ति में दो दोहरे उद्धरण शाब्दिक दोहरे उद्धरण का उत्पादन करते हैं" एक काफी सामान्य है, लेकिन किसी भी तरह से केवल एक ही नहीं अस्तित्व में)।

4
त्रुटि, गंभीर समस्या: आपने एक जीत की स्थिति निर्दिष्ट नहीं की है। उन कार्यक्रमों को किसके लिए अनुकूलित किया जाना चाहिए? लंबाई ( कोड-गोल्फ )?

1
कम से कम पहले तीन लिंक वहाँ सभी सीएसवी को अलग-अलग तरीके से परिभाषित करते हैं (और कम से कम दो कहते हैं कि इसे करने के बहुत सारे तरीके हैं)। इसलिए मैं यह मान रहा हूं कि "CSV" को एक प्रश्न में उपयोग के लिए और अधिक पूरी तरह से परिभाषित करने की आवश्यकता है (और यह कि समाधान अल्पविरामों में विभाजित होने से बचने की कोशिश करेंगे और भागने से नहीं निपटेंगे क्योंकि यह उन्हें छोटा होने की अनुमति देता है)।

2
ठीक है मैंने सीएसवी प्रारूप के बारे में बारीकियों को शामिल करने के लिए प्रश्न संपादित किया है जिसे मैं हर किसी का उपयोग करना चाहूंगा।
शॉन वाइल्ड

1
CRLF? गंभीरता से? यह यूनिक्स पर एक बहुत बड़ा जुर्माना देने जा रहा है, जहां सीआर का मतलब टेक्स्ट फाइलों में कुछ और है। आप शायद "न्यूलाइन" के साथ इसे बदलना चाहते हैं, जिससे ओएस-विशिष्ट न्यूलाइन का उपयोग किया जा सके।

जवाबों:


10

आज़माएं (Dyalog) APL , 38 43 बाइट्स

अंतिम इनपुट लाइन में एक अनुगामी न्यूलाइन होनी चाहिए।

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

इसे ऑनलाइन आज़माएं! Dyalog APL के ऑफ़लाइन संस्करण में, ]boxing ON -style=minसमान प्रभाव के लिए निष्पादित करें ।

व्याख्या

{... }एक अनाम फ़ंक्शन जहां तर्क का प्रतिनिधित्व करता है:

¯1 ⌽ ⍵ पीछे की ओर नई रेखा घुमाएँ

(s ←... )परिभाषित समारोह है इस प्रकार है, और इसे लागू

  1 ↓¨ प्रत्येक के पहले चरित्र को छोड़ दें

  ⊢ ⊂⍨ लाइन, जहां विभाजित

  ⊃ = ⊢ पहला वर्ण स्ट्रिंग में वर्णों के बराबर है

',' ,¨ फिर प्रत्येक पंक्ति के लिए एक अल्पविराम प्रस्तुत करें

समारोह लागू रों प्रत्येक पंक्ति के लिए

{... }अब निम्नलिखित अनाम फ़ंक्शन लागू करें:

  1 ↓ ⍵ पहला तत्व छोड़ें (पंक्ति हेडर)

  ↓ ⍉ ↑ स्तंभों की सूची में पंक्तियों की सूची स्थानांतरित करें

  ↑¨ प्रत्येक तत्व (प्रविष्टियों की सूची) को गद्देदार प्रविष्टियों के मैट्रिक्स में बनाएँ

  ⍉ ⍪ एक-स्तंभ मैट्रिक्स में करें, फिर एक-पंक्ति मैट्रिक्स में स्थानांतरित करें

  (⊃⍵) ⍪ शीर्ष पर तर्क का पहला तत्व (हेडर की सूची) डालें

नोट: जबकि रेखा खींचने वाले वर्ण मेरे समाधान में स्पष्ट रूप से उपयोग नहीं किए गए हैं, वे एपीएल वर्ण सेट का हिस्सा हैं, और एकल बाइट्स के रूप में भी गिना जाएगा।


उपरोक्त टिप्पणियां देखेंIs input using list or array of strings (and no newlines) valid? Nope.
edc65

@ edc65 फिक्स्ड। धन्यवाद।
Adám

हाह, वह बॉक्सिंग डिस्प्ले निश्चित रूप से काम आता है :)
वेन

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'┴')┘"

मुझे लगता है कि इसमें बहुत सुधार किया जा सकता है लेकिन मैं समय से बाहर भाग गया। सभी लाइन एंडिंग \nनहीं के साथ हैं \r, एन्कोडिंग UTF8 है जिसमें कोई BOM नहीं है।


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'("└" "─" "┴" "┘")))

Ungolfed:

(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 बाइट्स नहीं है?
21

1
@ Adám ... हां ... फिक्स्ड
Mwr247

आप इस का उपयोग करते हैं, (के बाद और अंत में backticks के साथ) के g('└┴┘')बराबर नहीं है ? g└┴┘g
NoOneIsHere

1
padEndअमानक है। आपको आवश्यक निष्पादन वातावरण निर्दिष्ट करना चाहिए।
नील

1
इसके अलावा, ऐसे कुछ स्थान हैं जहाँ आप लिखते हैं `foo`+bar+`baz`- आप एक टेम्पलेट का उपयोग करके एक बाइट को बचा सकते हैं `foo${bar}baz`
नील

1

जावास्क्रिप्ट (ईएस 6), 281 बाइट्स

नोट: newlines के साथ एक एकल स्ट्रिंग के रूप में इनपुट - ओपी द्वारा अनुरोध के रूप में। अन्य उत्तर स्ट्रिंग सूची का उपयोग करते हैं - इनपुट में एक स्ट्रिंग सरणी का उपयोग करके मैं पहले विभाजन से बच सकता हूं और 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 बाइट्स और संक्षिप्त करने के लिए -1str.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 बाइट्स लगती हैं।
21

1
@ Adám तुम सही हो, मैंने चारपाई देखी।
कार्ल नैप

काम नहीं करता है, क्योंकि input()प्रत्येक कॉल पर केवल एक पंक्ति होती है। आपको input()तब तक कॉल करने की आवश्यकता होगी जब तक कि अधिक लाइनें न हों, या सीधे से पढ़ें stdin
22

कि इसके अलावा: 292 बाइट्स
movatica

0

सी #, 696 बाइट्स

golfed:

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;}

अघोषित (और अच्छे, क्योंकि ^ कि किसी के लिए कोई फायदा नहीं है):

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 बस फिर से जाँच की गई, गोल्फ स्ट्रीड विजुअल स्टूडियो में 666 कॉलम लंबा है। लेकिन न तो 666 और न ही 697 वैसे भी प्रतिस्पर्धी स्कोर हैं :)
पीट आर्डेन

आपके पास एक अनुगामी न्यूलाइन है, लेकिन इसे हटाते समय भी, यह अभी भी 696 बाइट्स है
अड्मां

@ Adám आह ... मैं एक लेटर काउंट / बाइट काउंट विसंगति का इंतजार कर रहा हूं ताकि मुझे यात्रा करनी पड़े। इस एक ("।") में इन अजीब प्रतीकों के साथ जाना चाहिए था। अद्यतन, धन्यवाद :)
पीट आर्डेन

उपरोक्त टिप्पणियां देखें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

एपीएल (डायलॉग एक्सटेंडेड) , 36 25 बाइट्स एसबीसीएस

पूरा कार्यक्रम। मान लेता है कि ABCDEFGHIJKLMNOPQRSTUVWXYZCSV फ़ाइल है। प्रिंट करने के लिए प्रिंट।

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

इसे ऑनलाइन आज़माएं!

⎕A अपरकेस एक lphabet (कम से कम करने के लिए संदर्भ में निर्मित स्ट्रिंग)
⎕CSV कि सीएसवी से मैट्रिक्स के लिए फ़ाइल और परिवर्तित पढ़
m← के रूप में की दुकान m(के लिए मीटर atrix)
1↓ ड्रॉप पहली पंक्ति
 पक्षांतरित
 स्तंभों की सूची में विभाजित
↑¨ एक मैट्रिक्स में तार के प्रत्येक सूची मिश्रण
()⍪ उस के शीर्ष पर निम्नलिखित स्टैक करें: उस
1↑m पर m
⌂disp लागू होने वाली पहली पंक्ति को लें dfns.disp(ड्रॉइंग लाइन ड्रॉइंग कैरेक्टर)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.