সিএসভি লাইন আপ


12

সংক্ষিপ্ত বিবরণ:

আপনার কাজটি হ'ল সিএসভি ইনপুটটিকে key=valueফর্ম্যাটে নেওয়া এবং এটি আরও সুসংহত (নীচে দেখুন) উপায়ে লাইন করা।

ইনপুট:

সর্বদা stdin মাধ্যমে । রেকর্ডগুলি সর্বদা নিম্নলিখিত ফর্মে থাকবে key=value:

foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
  • আগে থেকে সম্ভাব্য কীগুলির কোনও তালিকা থাকবে না, আপনাকে অবশ্যই ইনপুট পাঠ্যে এটি সন্ধান করতে হবে।
  • ইনপুটটির সমাপ্তি আপনার ওএসের জন্য যথাযথ EOFযে কোনও প্রয়োগই EOFযথাযথ be

আউটপুট:

আপনার আউটপুটটির প্রথম সারিটি বর্ণমালা অনুসারে সমস্ত কীগুলির একটি তালিকা হবে (কীগুলি সমস্ত সংখ্যা হলেও) are এরপরে, প্রতিটি রেকর্ড একই সিএসভি ফর্ম্যাটে প্রিন্ট করুন যথাযথ সংখ্যা শিরোনাম, কীগুলি তালিকাভুক্ত না করে। সুতরাং, উপরের উদাহরণের জন্য, সঠিক আউটপুটটি হবে:

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

প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী:

  • আমাকে কি ভুলভাবে ফর্ম্যাট করা ইনপুট সম্পর্কে চিন্তা করতে হবে?
    • না। আপনার প্রোগ্রামটি যা কিছু করতে পারে তা করতে পারে (একটি ব্যতিক্রম নিক্ষেপ, উপেক্ষা, ইত্যাদি) যদি ইনপুটটি সঠিকভাবে ফর্ম্যাট না করা হয়, উদাহরণস্বরূপ একটি লাইন foo,bar,baz
  • আমি কীভাবে বিশেষ অক্ষরগুলি অবলম্বন করতে পারি?
    • আপনি ধরে নিতে পারেন যে বিন্যাসের অংশ নয় এমন কোনও অতিরিক্ত ,বা =ডেটা থাকবে না key=value"এই প্রতিযোগিতার কোনও বিশেষ অর্থ নেই (যদিও এটি প্রচলিত সিএসভিতে রয়েছে)। কোনওভাবেই বিশেষ নয়।
    • লাইনগুলি নীচের রেজেক্সের সাথে মেলে: ^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
      • সুতরাং, উভয় কী এবং মানগুলি মিলবে [^=,]+
  • CRLFবনাম সম্পর্কে কি LF?
    • আপনার প্ল্যাটফর্মের জন্য ডিলিমিটার উপযুক্ত যেটি চয়ন করতে পারেন। বেশিরভাগ ভাষাগুলি কোনও বিশেষ বিস্মৃত কোড ছাড়াই এটি পরিচালনা করে।
  • শেষ কয়েকটি কলাম বিদ্যমান না থাকলে আমার কি ট্রিলিং কমাগুলি মুদ্রণ করা দরকার?
    • হ্যাঁ. উদাহরণ দেখুন।
  • সিএসভি পার্সার বা অন্যান্য অনুরূপ বাহ্যিক সরঞ্জাম অনুমোদিত?
    • না। আপনাকে অবশ্যই ডেটা পার্স করতে হবে।

15
কেউ যখন এখনও প্রশ্ন জিজ্ঞাসা করে না। :-)
জাস্টিন

5
@ কুইন্টাক্স যদি আমি নিজেকে এই প্রশ্নটি জিজ্ঞাসা করি যা গণনা করা হয়;)
durron597

18
সমস্ত FAQ গুলি কীভাবে কাজ করে তা অনুভব করি।
মার্টিন এন্ডার

আমার কী এবং মানগুলির তালিকায় আমি কি একটি পিছনে কমা পেতে পারি? এটি আমার
কোডটিকে আরও

@ প্লাজমাপাওয়ার আমি প্রশ্নটি বুঝতে পারি না; তবে আপনার প্রোগ্রামটি অবশ্যই প্রদত্ত উদাহরণ
ইনপুটটির

উত্তর:


3

গল্ফস্ক্রিপ্ট, characters৪ টি অক্ষর

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

পার্ল, 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}

@ ডেনিস নীচে উল্লেখ করেছেন, আপনি -n ব্যবহার করে এটি 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। ৩. কোঁকড়ানো বন্ধনীগুলির পরে সেমিকোলন ছাড়ছে।
ডেনিস

ধন্যবাদ @ ডেনিস আমি আপনার পরামর্শগুলির দ্বিতীয়টি বাস্তবায়ন করেছি। আমি এখনও মিশ্রণে ফেলে দিতে পারি তবে আমি এমন একজন পিউরিস্টের মতো অনুভব করছি যিনি তার ফোনে এটিএম টাইপ করতে খুব অলস :-) এছাড়াও এর জন্য একটি এন্ড ব্লক লাগবে, তবে আমি মনে করি এটি এখনও নেট জিততে পারত ।
skibrianski

হ্যাঁ, যোগ যোগ করলে এন্ড ব্লকটি কেবল 3 টি অক্ষর (দুটি পয়েন্ট) সাশ্রয় করে। আমি "বিশুদ্ধ" সমাধান পছন্দ করি। কমপক্ষে অন্য উত্তরগুলির একটির কাছে না আসা পর্যন্ত =)
স্কিবিরিয়ানস্কি

পার্ল আক্ষরিকভাবে while (<>) { ... }পুরো স্ক্রিপ্টের চারপাশে মোড় নেয়, সুতরাং এন্ড ব্লকের প্রয়োজন নেই। স্ক্রিপ্টের for(<>){শুরুতে এবং }শেষে সরিয়ে দিন ।
ডেনিস

3
তবুও এটি কাজ করবে, আপনি যতক্ষণ }না স্ক্রিপ্টের শেষে মুছে ফেলবেন, forলুপের সাথে সম্পর্কিত নয়। এছাড়াও, আপনি এর পরিবর্তে প্রকৃত নিউলাইন ব্যবহার করে আরও একটি চর সংরক্ষণ করতে পারেন \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

এই শিমটি একটি ব্রাউজারে স্পাইডারমনকি 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
    );
}

প্রশ্নটি আপনাকে বলছে না যে আপনাকে "stdout" ব্যবহার করতে হবে - আপনি কিছু বাইটের 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

কে 4 (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
$ 

তবুও যদি আপনি এই ধরণের ধাঁধার জন্য একটি গ্রহণযোগ্য সরঞ্জাম হিসাবে আমার পূর্ব-বিদ্যমান কে-ফিল্টার মোড়ক, awq.k কে বিবেচনা করতে ইচ্ছুক হন, তবে আমরা এটি করতে পারি:

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

শেল উদ্ধৃতি র‌্যাংলিংকে আপনি কীভাবে গণনা করেন তার উপর নির্ভর করে যা 46 টি অক্ষর বা 40 হয়


এটি চালানোর জন্য কোন ধরণের পরিবেশ প্রয়োজন? qকমান্ড? হয় awq.kকোথাও প্রকাশিত?
ডিজিটাল ট্রমা

32-বিট কিউ এখন kx.com/software-download.php থেকে ফ্রিওয়্যার হিসাবে উপলব্ধ । (তাদের কাছে নিখরচায় একটি সময়-সীমাবদ্ধ পরীক্ষার সংস্করণ ছিল)) হুম, দেখে মনে হচ্ছে এএডকিউ বাস্তবে কোথাও প্রকাশিত হয়নি; আমার সে সম্পর্কে কিছু করা উচিত
অ্যারন ডেভিস

0

সি # - 369

(লিনকপ্যাডে)

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এফএকিউ প্রশ্ন দেখুন) দুর্ভাগ্যক্রমে আমার কাছে পরীক্ষার জন্য ভিজ্যুয়াল স্টুডিওর একটি অনুলিপি নেই।
durron597

আমার প্রথমে নোটটি যুক্ত করা উচিত ছিল, তবে আমার এখনই আছে। হ্যাঁ এটা কাজ করে. আমি এটি লিনকপ্যাডে তৈরি এবং পরীক্ষিত করেছি। আমি এটি কনসোল অ্যাপে পরীক্ষা করে দেখিনি, তবে এটি কাজ করবে না এমন কোনও কারণ নেই। তবে একটি কনসোল অ্যাপ্লিকেশন অবশ্যই কোডটিতে আরও বাইট যুক্ত করবে।
jzm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.