web-dev-qa-db-ja.com

Excelファイルを編集するためのBashスクリプト

この形式のExcelファイルが複数あります。
これらは出勤と退出の日付と時刻です。

 --------------------------------- 
 |名前|時間| 
 --------------------------------- 
 |人A | 03-Jul-17 8:15 AM | 
 |人A | 03-Jul-17 10:32 AM | 
 |人A | 03-Jul-17 1:56 PM | 
 |人A | 03-Jul-17 6:15 PM | 
 |人A | 04-Jul-17 8:29 AM | 
 |人A | 04-Jul-17 8:58 AM | 
 |人A | 04-Jul-17 9:43 AM | 
 |人A | 04-Jul-17 1:03 PM | 
 |人A | 04-Jul-17 2:17 PM | 
 |人A | 04-Jul-17 5:58 PM | 
。
。
。
 |人A | 17-Jul-17 7:45 AM | 
 |人A | 17-Jul-17 8:10 AM | 
 |人A | 17年7月31日3:26 PM | 
 |人A | 17-Jul-17 7:29 PM | 
 ----------------------------- ---- 

このデータを抽出し、次の形式の新しいExcelファイルとして保存します。

 --------------------------------------------- 
 |名前|日付|タイムイン|タイムアウト| 
 ------------------------------------------ --- 
 |人A | 2017年7月3日|午前8時15分|午後6時15分| 
 |人A | 04-Jul-17 | 8:29 AM | 5:58 PM | 
。
。
。
 |人A | 2017年7月31日|午前7時45分|午後7時29分| 
 ----------------------------------------- ---- 

基本的に、データを日付ごとに1つのエントリに配置し、その日付の最も早い時刻をTime Inとして、その日付の最も遅い時刻をTime Outとして配置します。

この形式のExcelファイルは複数あり、手動で行うには時間がかかりすぎます。

それらを.csvに変換してから最初に編集してから.xlsxに戻す場合は、クールです。

PS:グラブの200 repのバウンティ。

2
Parto

ファイルをcsvに変換し、PHPスクリプトを使用してコンテンツを解析し、実際に必要な方法で作成しました。結果は新しいファイルに保存され、それらのファイルはxlsに変換されてから1つのノートブックにマージされました。

変換とマージの部分は手動で行われました。これは最善の解決策ではありませんが、今のところ機能しています。

スクリプトは次のとおりです。

 //データディレクトリからファイルのリストを取得
 $ files = array_diff(scandir( './ data')、array( '。'、 '..')); 
 foreach($ files as $ file):
 
 // csvファイルからすべてのデータを取得し、$ data配列に保存します
 $ csvFile = file( 'data /' 。$ file); 
 $ data = $ list = []; 
 foreach($ csvFile as $ line){
 $ data [] = str_getcsv($ line); 
} 
 unset($ data [0]); 
 
 //データ配列を解析し、さまざまなセクションを取得します:name。日付と時刻
 foreach($ data as $ v){
 $ date = strtotime($ v [1]); 
 $ list [date( 'dm-Y'、 $ date)] [] = array(
 'name' => $ v [0]、
 'date' => date( 'd/m/Y'、$ date)、
 'in' => $ date 
); 
} 
 
 //新しい配列を作成し、その中に解析したデータをヘッダー列とともに保存します
 $ new = array(array( 'Name'、 'Date'、 'Time In'、 'Time Out')); 
 foreach($ list as $ k => $ v){
 $ out = max(array_column($ v、 'in')); 
 $ name = $ v [0] ['name']; 
 $ new [] = array (
 'name' => ucwords(strtolower($ name))、
 'date' => $ v [0] ['date']、
 'in' = > date( 'h:i A'、$ v [0] ['in'])、
 'out' => date( 'h:i A'、$ out)
) ; 
} 
 
 //このファイル名を使用した新しいディレクトリ内の新しいファイルの名前
 $ filename = str_replace( '。csv'、 '' 、basename($ file)); 
 $ fn = st rtolower($ filename .'- log.csv '); 
 
 //ファイルを開き、CSV 
 $ out = fopen(' new/'。として新しい配列を出力します。 $ fn、 'w'); 
 foreach($ new as $ l){
 fputcsv($ out、$ l、 "、"、 '"'); 
} 
 fclose($ out); 
 
 endforeach; 
1
Parto

必要なスクリプトは2つあります。 XLSからCSVに変換するのはコマンド xls2csv で、もう1つはgithubのスクリプトです csv2xls (another csv2xls )。 csv2xlsx (および別の csv2xlsx )もあります。

2つの変換の間に、お気に入りのツールを使用してファイルを編集できます。

自分でやりたい場合:xlsxファイル(および同じことが適用されるODT(open/libeoffice)はzipアーカイブであり、データを含むXMLを含みます。それから解凍でき、データはXMLです。XMLの操作は少しですCSVの方が確かに難しいですが、操作が自動化されるとかなり効率的になります。

2
Rinzwind