.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.