CSV को पंक्तिबद्ध करें


12

अवलोकन:

आपका काम CSV इनपुट को key=valueप्रारूप में लेना है और इसे अधिक संगठित (नीचे देखें) तरीके से पंक्तिबद्ध करना है।

इनपुट:

हमेशा डंडा लेकर । रिकॉर्ड हमेशा निम्नलिखित रूप में होंगे key=value:

foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
  • अग्रिम में संभावित कुंजी की कोई सूची नहीं होगी, आपको उन्हें इनपुट टेक्स्ट में ढूंढना होगा।
  • इनपुट का अंत आपके ओएस के लिए EOFजो भी EOFउचित हो , के द्वारा संकेत दिया जाएगा ।

आउटपुट:

आपके आउटपुट की पहली पंक्ति सभी कुंजियों की एक सूची होगी, वर्णानुक्रम में (भले ही कुंजियाँ सभी संख्याएँ हों)। उसके बाद, प्रत्येक रिकॉर्ड को उसी CSV में सूचीबद्ध करें, जो सूचीबद्ध की गई कुंजियों के बिना उपयुक्त संख्या शीर्षक को प्रारूपित करता है। इसलिए, ऊपर दिए गए उदाहरण के लिए, सही आउटपुट होगा:

abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop

सामान्य प्रश्न:

  • क्या मुझे अनुचित रूप से स्वरूपित इनपुट के बारे में चिंता करने की ज़रूरत है?
    • यदि आपका इनपुट सही ढंग से फ़ॉर्मेट नहीं किया गया है, तो उदाहरण के लिए, आपका प्रोग्राम वह कर सकता है जो कोई अपवाद (अपवाद, उपेक्षा, इत्यादि फेंकें) foo,bar,baz
  • मैं विशेष पात्रों से बचने के लिए कैसे संभाल सकता हूं?
    • आप मान सकते हैं कि कोई अतिरिक्त ,या =डेटा नहीं होगा जो key=valueप्रारूप का हिस्सा नहीं हैं । "इस प्रतियोगिता में कोई विशेष अर्थ नहीं है (भले ही यह पारंपरिक सीएसवी में हो)। किसी भी तरह से विशेष नहीं है।
    • पंक्तियों को निम्नलिखित रेगेक्स से मेल खाना चाहिए: ^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
      • इसलिए, कुंजी और मूल्य दोनों मेल खाएंगे [^=,]+
  • CRLFबनाम के बारे में क्या LF?
    • आप अपने प्लेटफ़ॉर्म के लिए जो भी परिसीमन उपयुक्त है, उसे चुन सकते हैं। अधिकांश भाषाएं इसे विशेष परिसीमन कोड के बिना संभालती हैं।
  • यदि पिछले कुछ कॉलम मौजूद नहीं हैं, तो क्या मुझे ट्रेलिंग कॉमा प्रिंट करना होगा?
    • हाँ। उदाहरण देखें।
  • क्या CSV पार्सर या अन्य समान बाहरी उपकरणों की अनुमति है?
    • नहीं। आपको डेटा को स्वयं पार्स करना होगा।

15
जब किसी ने अभी तक कोई सवाल नहीं पूछा। :-)
जस्टिन

5
@Quincunx अगर मैं खुद से यह सवाल
पूछूं

18
मुझे लगता है कि सभी एफएक्यू कैसे काम करते हैं।
मार्टिन एंडर

क्या मैं कुंजी और मूल्यों की अपनी सूची में एक अल्पविराम अल्पविराम लगा सकता हूं? यह मेरे कोड को बहुत छोटा बना देगा ...
प्लाज्मा

@PlasmaPower मुझे सवाल समझ में नहीं आता है; हालाँकि, आपके कार्यक्रम को निश्चित रूप से दिए गए उदाहरण इनपुट के लिए उदाहरण आउटपुट से मेल खाना चाहिए
Durron597

जवाबों:


3

GolfScript, 64 अक्षर

n%{','/{'='/}%}%:I{{0=}/}%.&$:K','*n{`{{(2$=*}%''*\;}+K%','*n}I/

कोड गोल्फस्क्रिप्ट में एक सीधे-आगे का कार्यान्वयन है, आप ऑनलाइन उदाहरण का परीक्षण कर सकते हैं ।

एनोटेट कोड:

# Split the input into lines, each line into tuples [key, value]
# and assign the result to variable I
n%{','/{'='/}%}%:I

# From each tuple take the 0'th element (i.e the key)
{{0=}/}%

# Take the unique items (.&), sort ($) and assign the result to variable K
.&$:K

# Output: join values with , and append a newline
','*n

# {...}I/: Loop over all lines of the input 
{

  # `{...}+K%: Loop over all keys and initially push the current 
  # line for each of the keys
  `{
    # stack here is [current key, current line]
    # {}%: map to all the items of the current line
    {
      # extract the key from the current item and compare
      (2$=
      # if equal keep [value], otherwise multiply with 0, i.e. discard
      *
    }%
    # join the results (may be one or zero) and drop the key
    ''*\; 
  }+K%
  # Output: join values of current line with , and append a newline
  ','*n
}I/

2

पर्ल 6: 119 अक्षर, 120 बाइट्स

my@l=lines.map:{/[(\w+)\=(\w+)]+%\,/;push $!,~«@0;$%(@0 Z=>@1)}
say .join(",") for$!.=sort.=uniq,($(.{@$!}X//"") for@l)

डी-golfed:

my@l=lines.map: {
    # Parse the key=value pairs,
    # put all the keys in $/[0] (or $0)
    # put all the values in $/[1] (or $1)
    / [ (\w+) \= (\w+) ]+ % \, /;

    # Push all the keys into $!
    # (@0 just means @$0 or $/[0].list)
    push $!, ~«@0;

    # Return a hash of keys zipped into pairs with the values
    $%( @0 Z=> @1 )
}

$!.=sort.=uniq;
# …i.e., $! = $!.sort.uniq;

# Print the CSV for the keys ($!),
# followed by the CSVs for the hashes we made for each line,
# as accessed by our sorted key list. (… .{@$!} …)
# If the value doesn't exist, just use "" instead. (… X// "" …)
say .join(",") for $!, ($( .{@$!} X// "" ) for @l)

2

perl, 129/121

129 बाइट्स, कोई कमांड लाइन स्विच नहीं:

for(<>){push@x,{%g=map{split/=/}split/[,
]/};@h{keys%g}=()}@k=sort keys%h;$"=",";sub P{print"@_
"}P@k;for$x(@x){P map{$$x{$_}}@k}

जैसा कि @ डेनिस नीचे बताते हैं, आप इसका उपयोग करके 120 + 1 = 121 प्राप्त कर सकते हैं:

push@x,{%g=map{split/=/}split/[,
]/};@h{keys%g}=()}@k=sort keys%h;$"=",";sub P{print"@_
"}P@k;for$x(@x){P map{$$x{$_}}@k

मूल रूप से, प्रत्येक पंक्ति के लिए, हम जोड़ों की सूची प्राप्त करने के लिए अल्पविराम से विभाजित होते हैं। प्रत्येक जोड़ी के लिए, हम कुंजी और मूल्य प्राप्त करने के लिए बराबर चिह्न द्वारा विभाजित होते हैं। हम कुंजी / मान युग्म को% h और एक स्थानीय हैशरेप में सेट करते हैं। कुंजी की सूची निर्धारित करने के लिए पूर्व का उपयोग किया जाता है। इस लाइन के मूल्यों को याद रखने के लिए उत्तरार्द्ध का उपयोग किया जाता है।


1
आप द्वारा कुछ वर्णों को सहेज सकते हैं: 1. -nइसके बजाय स्विच का उपयोग करना for(<>){...}। 2. [, ]उपयोग करने के बजाय चारों ओर विभाजन chomp। 3. घुंघराले कोष्ठक के बाद अर्धविराम को छोड़ना।
डेनिस

धन्यवाद @ डेनिस। मैंने आपके सुझावों के बाद के 2 को लागू किया है। मैं अभी तक मिश्रण में फेंक नहीं सकता, लेकिन मैं एक शुद्धतावादी की तरह महसूस कर रहा हूं, जो अपने फोन एटीएम पर टाइप करने के लिए बहुत आलसी है :-) इसके अलावा एक अंत ब्लॉक की आवश्यकता होगी, लेकिन मुझे लगता है कि यह अभी भी एक शुद्ध जीत होगी ।
skibrianski

हाँ, -n जोड़ने से केवल 3 वर्ण (दो बिंदु) END ब्लॉक के साथ बचते हैं। मैं "शुद्ध" समाधान पसंद करता हूं। कम से कम जब तक अन्य उत्तरों में से एक = करीब नहीं हो जाता है)
skibrianski

पर्ल शाब्दिक रूप while (<>) { ... }से पूरी स्क्रिप्ट के चारों ओर घूमता है, इसलिए END ब्लॉक की कोई आवश्यकता नहीं है। बस for(<>){शुरुआत और }स्क्रिप्ट के अंत में हटा दें ।
डेनिस

3
यह तब भी काम करेगा, जब तक आप }स्क्रिप्ट के अंत में हटा देते हैं , forलूप के अनुरूप नहीं । इसके अलावा, आप इसके बजाय एक वास्तविक newline का उपयोग करके एक और चार को बचा सकते हैं \n
डेनिस

1

जावास्क्रिप्ट ( ES5 ) 191 183 179 168 बाइट्स

यह मानकर कि कोड स्पाइडरमोंकी कमांड लाइन में चलाया जाता है:

for(b=[a={}];l=readline(i=0);b.push(c))for(c={},d=l.split(/,|=/);e=d[i++];)c[a[e]=e]=d[i++];for(;c=b[i++];)print(Object.keys(a).sort().map(function(x){return c[x]})+[])

परिणाम:

> js test.js < input.txt
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop

इस शिम का उपयोग एक ब्राउज़र में spidermonkey के अनुकरण के लिए किया जा सकता है readlineऔर print:

var I = 0, LINES = '\
foo=bar,baz=quux\n\
abc=123,foo=fubar\n\
baz=qwe,abc=rty,zxc=uiop,foo=asdf'.split('\n'),
readline = function(){
    return LINES[I++];
}, print = function(){
    return console.log.apply(console, arguments);
};

Ungolfed:

a = {};                        // this object holds all keys found
b = [a];                       // array key:value pairs of each line, initialized with our key holder object in position 0
for(;l = readline();){         // store each line in l, loop until blank/undefined line
    c = {};                    // create a new object for this line's key:value pairs
    d = l.split(/,|=/);        // split line by commas and equals
    for(i = 0; e = d[i++];){   // loop through each key
        a[e] = e;              // set the key=key for key holder object
        c[e] = d[i++];         // set key=value for the line object
    }
    b.push(c);                 // push line object onto array
}
for(i = 0; c = b[i++];){       // loop through all line objects until undefined
    print(                     // print line
        Object.keys(a).sort(). // get sorted list of keys
        map(function(x){
            return c[x]        // map values from line object
        })
        + []                   // cast array to string
    );
}

सवाल यह नहीं कहता है कि आपको "स्टडआउट" का उपयोग करना होगा - आप इस तरह से कुछ बाइट्स alertका उपयोग कर सकते हैं console.logऔर बचा सकते हैं।
गौरांग टंडन

@ गौरांगटांडन तब, मुझे सभी रूपरेखा रेखाओं को मिलाना होगा। मैं अपने उत्तर को स्पिडरमॉन्की कमांड लाइन का उपयोग करने के लिए अद्यतन कर सकता हूं और इसके बजाय उपयोग कर सकता हूं readlineऔर printवास्तविक
स्टडिन

1

बैश + कोरुटिल्स, 188 138 बाइट्स

p=paste\ -sd,
f=`cat`
h=`tr , '\n'<<<$f|cut -d= -f1|sort -u`
$p<<<"$h"
for l in $f;{
join -o2.2 -a1 - <(tr =, ' \n'<<<$l|sort)<<<"$h"|$p
}

आउटपुट:

$ ./lineupcsv.sh < input.csv 
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
$ 

0

हास्केल, 357 334

import Data.List
o=1<2
s u|u==""=""|o=tail u
t=takeWhile
d=dropWhile
c=(/=',')
e=(/='=')
p x|x/=""=Just((t e x,t c.s.d e$x),s.d c$x)|o=Nothing
g=m(unfoldr p).lines
k=nub.sort.(m fst=<<).g
[]#_=[]
(t@(x,u):z)#n@(a,b)|x==a=n:z|o=t:z#n
i=intercalate
main=interact$ \d->i"\n"$(i","$k d):m(i",".m snd.foldl(#)(m(flip(,)"").k$d))(g d)
m=map

gपार्सिंग कर रहा है - यह इनपुट को लाइनों में विभाजित करता है और प्रत्येक लाइन को (key,value)जोड़े की सूची में मैप करता है । k, सभी कुंजी को एक सूची में सम्‍मिलित करके और डुप्लिकेट को हटाकर, सभी अद्वितीय कुंजियों के साथ एक सूची बनाता है जिसे मैं बाद में छांटने के लिए उपयोग कर सकता हूं। मैं प्रत्येक पंक्ति के लिए "अंदर" main( m(flip(,)"").k$d == [("abc",""),("baz",""),("foo",""),("zxc","")]) सेट बनाकर ऐसा करता हूं , और फिर प्रत्येक (key,value)जोड़ी को एक पंक्ति से लेता हूं और इसे उस स्थान पर रखता हूं जहां वह सूची में है ( foldl)। पंक्ति 1 उदाहरण पैदावार से [("abc",""),("baz","quux"),("foo","bar"),("zxc","")], जिसे मैं एक एकल स्ट्रिंग ( ",quux,bar,") में समेटता हूं , अन्य पंक्तियों के साथ मिलाप करता हूं , और प्रिंट करता हूं ।

>>> csv.exe < input.txt
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop

0

पायथन 2.7 - 242 बाइट्स

bleh

import os
c=[r.split(',')for r in os.read(0,99).split('\n')]
k=sorted(list(set(sum([[s.split('=')[0]for s in r]for r in c],[]))))
print','.join(k)
for l in c:
 t=[''for i in k]
 for s in l:
    o,v=s.split('=')
    t[k.index(o)]=v
 print','.join(t)

ध्यान दें कि इंडेंटेशन की दूसरी परत एक एकल टैब वर्ण है, एसई की तरह चार स्थान इसे प्रदान नहीं करते हैं।

Ungolfed:

#!/bin/python2

import os

# I do input as a list comprehension in the original but this is equivalent
c = []

# For each line in the input
for r in os.read(0,99).split('\n'):
    # Add a list of key=value pairs in that row to c
    c.append(r.split(','))

# Another thing done as a list comprehension, but I'll space it out
k = []

# For each list of key=value pair s in c
for r in c:
    # For each actual key=value pair in that list
    for s in r:
        # Get the key
        k.append(s.split('=')[0])

# Discard dupes by converting to set and back, then sort
k = sorted(list(set(k)))

# Seperate these keys by commas, then print
print ','.join(k)

# For each line in c
for l in c:
    # t has one empty string for each key in the input
    t = ['' for i in k]
    # For each key=value pair in the line
    for s in l:
        # o = key, v = value
        o, v = s.split('=')
        # Find the position that the key is in the list of keys, then put the
        # value in t at that position
        t[k.index(o)] = v

    # Now each value is in the right position and the keys with no values on this
    # line have an empty string. Join everything with commas and print
    print ','.join(t)

0

अजगर 3: 200 195 192 189 187

import sys
r=[dict(p.split('=')for p in l[:-1].split(','))for l in sys.stdin]
x=set()
for d in r:x|=d.keys()
k=sorted(x)
for l in[k]+[[r.get(k,'')for k in k]for r in r]:print(*l,sep=',')

0

k4 (40? 51? 70? 46?)

मूल अभिव्यक्ति है

","0:{(x@<x:?,/?!:'x)#/:x}(!).'"S=,"0:/:

यह दोनों स्वीकार करता है और तार की एक सूची देता है

कल्पना से मेल खाने के लिए, हम अंतःक्रियात्मक रूप से कर सकते हैं

-1","0:{(x@<x:?,/?!:'x)#/:x}(!).'"S=,"0:/:."\\cat";

स्टड से इनपुट को स्वीकार करता है और आउटपुट को स्टडआउट पर प्रिंट करता है

एक स्टैंडअलोन ऐप के लिए एक पाइप से इनपुट स्वीकार करना, हम ऐसा कर सकते हैं:

$ cat i.k
.z.pi:{t,:`\:x}
.z.exit:{-1","0:{(x@<x:?,/?!:'x)#/:x}(!).'"S=,"0:/:t}
$ cat i.txt|q i.k
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
$ 

यदि आप इस तरह की पहेली के लिए एक स्वीकार्य उपकरण के रूप में मेरे पहले से मौजूद k-as-filter आवरण, awq.k पर विचार करने को तैयार हैं, तो हम ऐसा कर सकते हैं:

$ cat i.txt|awq.k '","0:{(x@<x:?,/?!:'\''x)#/:x}(!).'\''"S=,"0:/:'

जो या तो 46 अक्षर या 40 है, जो इस बात पर निर्भर करता है कि आप शेल बोली को कैसे बदलते हैं


इसे चलाने के लिए किस तरह के वातावरण की आवश्यकता है? qआदेश? है awq.kकहीं प्रकाशित?
डिजिटल ट्रामा

32-बिट q अब kx.com/software-download.php से फ्रीवेयर के रूप में उपलब्ध है । (वे केवल समय-सीमित परीक्षण संस्करण के लिए मुफ्त में उपयोग करते थे।) हम्म, ऐसा लगता है कि वास्तव में awq कहीं भी प्रकाशित नहीं हुआ है; मुझे उसके बारे में कुछ करना चाहिए।
हारून डेविस

0

C # - 369

(LINQPAD में)

void C(string a){var k=a.Split(new[]{',','\n'}).Select(s=>s.Split('=')[0]).OrderBy(o=>o).Distinct();var t=string.Join(",", k)+"\n";foreach(var x in a.Split('\n')){for(int i=0;i<k.Count();i++){foreach(var y in x.Split(',').OrderBy(o=>o.Split('=')[0]))if(k.ElementAt(i)==y.Split('=')[0])t+=y.Split('=')[1];t+=",";}t=t.Remove(t.LastIndexOf(','),1)+"\n";}Console.Write(t);}

Ungolfed

void C(string a)
{
    var k=a.Split(new[]{',','\n'}).Select(s=>s.Split('=')[0]).OrderBy(o=>o).Distinct();
    var t=string.Join(",", k)+"\n";
    foreach(var x in a.Split('\n'))
    {
        for(int i=0;i<k.Count();i++)
        {
            foreach(var y in x.Split(',').OrderBy(o=>o.Split('=')[0]))
                if(k.ElementAt(i)==y.Split('=')[0])
                    t+=y.Split('=')[1];
            t+=",";
        }
        t=t.Remove(t.LastIndexOf(','),1)+"\n";
    }
    Console.Write(t);
}

टेस्ट स्ट्रिंग इनपुट

C("foo=bar,baz=quux\nabc=123,foo=fubar\nbaz=qwe,abc=rty,zxc=uiop,foo=asdf");

उत्पादन

abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop

बस जिज्ञासु, यह सी # है इसलिए इसे खिड़कियों में काम करना चाहिए, लेकिन क्या यह है? (मेरे CRLFबनाम LFपूछे जाने वाले प्रश्न देखें ) दुर्भाग्य से मेरे पास परीक्षण करने के लिए विज़ुअल स्टूडियो की एक प्रति नहीं है।
डुर्रोन 597

मुझे मूल रूप से नोट को जोड़ना चाहिए था, लेकिन मेरे पास अब है। हाँ यह काम करता है। मैंने इसे linqpad में बनाया और परखा है। मैंने इसे कंसोल ऐप में परीक्षण नहीं किया है, लेकिन कोई कारण नहीं है कि यह काम क्यों नहीं करेगा। लेकिन एक कंसोल ऐप जाहिर तौर पर कोड में अधिक बाइट्स जोड़ देगा।
jzm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.