.Xls / .xlsx স্প্রেডশিটগুলিকে একটি তালিকার উপর ভিত্তি করে একাধিক .csv এর রূপান্তর করুন


10

আমার একক .xls / .xlsx ফাইলের সমস্ত শীটকে একটি .csv এ রূপান্তর করতে হবে। এটি সমস্ত ডিরেক্টরি এবং উপ ডিরেক্টরিতে (পুনরাবৃত্ত) সমস্ত .xls ফাইলগুলিতে করা হবে।

পদক্ষেপ 1 : সমস্ত .xls এর শিটের নামগুলি একটি .csv তে পান:

for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done

filename-sheetnames-list.csv একটি তালিকা হিসাবে কাজ করতে পারেন:

sheetname1
sheetname2
sheetname3

পদক্ষেপ 2 : in2csv ব্যবহার করে একটি নির্দিষ্ট শীটকে .csv এ রূপান্তর করার কোডটি হ'ল:

in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv

আমি কীভাবে প্রতিটি শিটের নাম একটি। Xls / x এ পেতে পারি এবং একটি .xls / এক্স ধারণকারী ডিরেক্টরিতে প্রতিটি শীট আলাদাভাবে লিখতে পারি?

in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv .... কেবল শীট 1 সিএসভিতে আউটপুট দেয়, কীভাবে এ থেকে সমস্ত পত্রক পাবেন তা নিশ্চিত নন।


2
কেন findপ্রতিটি .xls{,x}এবং প্রতিটি শীট ব্যবহার করে লুপ করবেন না -exec?
মিষ্টান্ন

1
@glennjackman এটি এখানে ইউনিক্স এবং লিনাক্সের মতো ঠিক তেমন বিষয়ের উপরে রয়েছে ।
টেরডন

উত্তর:


10

আপনি অন্য লুপের ভিতরে একটি লুপ রাখতে পারেন।

ত্রুটিগুলি এড়ানোর জন্য, ফলাফল forসহ ব্যবহার করবেন না find

while IFS= read -r file; do
    while IFS= read -r sheet; do
        in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
    done < <(in2csv -n "$file")
done < <(find . -name '*.xls' -o -name '*.xlsx')

@ মুরু আহ ক্র্যাম্প তুমি একেবারেই সঠিক. আমি এমন পরিবেশে পরীক্ষা করেছি যেখানে আইএফএস ইতিমধ্যে পরিবর্তিত হয়েছিল অবশ্যই এটি নীচের দিকে প্রচার করেছিল। বোকা । ধন্যবাদ, সম্পাদনাটি উল্টে গেছে।
টেরডন

@RoVo প্রথম বিকল্পটি ভাল কাজ করে। দ্বিতীয়টি তবে আমাকে কোনও আউটপুট বা ত্রুটি দেয় না। আমি নিশ্চিত না কেন; একটি একক জন্য .xls in2csv --write-sheets "-" filename.xls > sheetname.csvশুধুমাত্র প্রথম শীট দেয়। সমস্ত শীট লিখতে কী অতিরিক্ত তথ্য যুক্ত করতে হবে তা আমি জানি না। এটি আপনার কোড সংশোধন করার জন্য আমাদের ক্লু দেবে।
চতুর্থ

1
আপনি কি সংস্করণ 1.0.2 আপডেট করেছেন? pip install csvkit -U। আমি মনে করি এটির কাজটি আপনার পছন্দ মতো নয়, প্রথম বিকল্পের সহজ
স্ক্রিপ্টের সাথে

এখনও আপডেটের সাথে কাজ করে না, এবং হ্যাঁ আমি এই তালিকার চেয়ে আরও বেশি পছন্দ করব যে --write-sheets আপনি অন্য বিকল্প হিসাবে বিকল্প বিকল্পটি সেট করতে পারেন ... আমি উত্তর হিসাবে প্রথম বিকল্পটি গ্রহণ করব। ধন্যবাদ @ রওভো
চতুর্থ

1
অন্য উত্তরের বিকল্প বিকল্প থাকতে পারে সাধারণত একটি ভাল ধারণা। ধন্যবাদ, খুশি যে আমি সাহায্য করতে পারি।
pLumo

7

খোঁজ এবং ব্যাশ ব্যবহার এড়িয়ে যাওয়া:

shopt -s globstar  # enable recursive globbing
for f in **/*.xls{,x}  # for files ending in .xls or .xlsx
do
    in2csv -n "$f" |   # get the sheetnames
      xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
done

এই স্ক্রিপ্টটি মার্জিত দেখাচ্ছে তবে এর আউটপুটটিতে filename-{}.csvকোনও ডেটা নেই। আমি একজন শিক্ষানবিস এবং স্ক্রিপ্টটি সম্পাদনা করে এবং পড়ার দ্বারা ত্রুটিটি খুঁজে পাওয়া যাবে বলে মনে হচ্ছে না। কিছু সাহায্য?
চতুর্থ

@ চিন্তান আমার খারাপ, আমি ভুলে যাব যে পুনঃনির্দেশটি বাইরে থাকবে xargs। সংশোধন করা হয়েছে, এখন মার্জিত নয়।
মুরু

xargsএবং >মন্দ :-P। সে কারণেই আমি অন্য লুপটিকে পছন্দ করি, এটি ত্রুটির প্রবণতা কম।
pLumo

@ রোভো আমি সাধারণত অন্য লুপের জন্য যেতাম, কেবল এখানে অন্য একটি পদ্ধতি দেখাতে চেয়েছিলাম।
মারু

এটি এখন কাজ করে, তবে @ রোভো উত্তরের চেয়ে কিছুটা ধীর।
চতুর্থ

3

csvkit সংস্করণ> 1.0.2 এর সমস্ত শীট লেখার জন্য একটি বিল্টিন ফাংশন রয়েছে:

--write-sheets: WRITE_SHEETS
                      The names of the Excel sheets to write to files, or
                      "-" to write all sheets.

সুতরাং আপনি নিম্নলিখিত চেষ্টা করতে পারেন:

find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} \;

বিঃদ্রঃ:

এটি প্রত্যাশার মতো 100% কাজ করবে না বলে মনে হচ্ছে। তবে চেষ্টা করে দেখতে পারা এবং এটি সেই বিকল্পটির সাথে প্রথম সংস্করণ হিসাবে ভবিষ্যতের সংস্করণগুলিতে বাস্তবায়নটি আরও ভাল / সহজ।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.