Сценарий Bash для редактирования файлов excel

У меня есть несколько файлов excel в этом формате.

--------------------------------- | Name | Time | --------------------------------- | Person A | 03-Jul-17 8:15 AM | | Person A | 03-Jul-17 10:32 AM | | Person A | 03-Jul-17 1:56 PM | | Person A | 03-Jul-17 6:15 PM | | Person A | 04-Jul-17 8:29 AM | | Person A | 04-Jul-17 8:58 AM | | Person A | 04-Jul-17 9:43 AM | | Person A | 04-Jul-17 1:03 PM | | Person A | 04-Jul-17 2:17 PM | | Person A | 04-Jul-17 5:58 PM | . . . | Person A | 31-Jul-17 7:45 AM | | Person A | 31-Jul-17 8:10 AM | | Person A | 31-Jul-17 3:26 PM | | Person A | 31-Jul-17 7:29 PM | ---------------------------------

Я хотел бы извлечь эти данные и сохранить их как новый файл excel в этом формате:

--------------------------------------------- | Name | Date | Time In | Time Out | --------------------------------------------- | Person A | 03-Jul-17 | 8:15 AM | 6:15PM | | Person A | 04-Jul-17 | 8:29 AM | 5:58PM | . . . | Person A | 31-Jul-17 | 7:45 AM | 7:29PM | ---------------------------------------------

В основном это необходимо для того, чтобы каждый день установить дату для каждой даты с наименьшим временем для этой даты в качестве Time In и последнего времени для этой даты в качестве Time Out.

В этом формате есть несколько файлов excel

Если вы хотите сначала преобразовать их в .csv, а затем преобразовать их обратно в .xlsx, это круто.

PS: Баунти из 200 человек для захватов.

2
задан 1 August 2017 в 10:36

6 ответов

Я преобразовал файлы в csv и использовал PHP-скрипт для анализа содержимого, создающего его, как я действительно хотел. Затем результат был сохранен в новом файле, затем эти файлы были преобразованы обратно в xls, затем объединены в один блокнот.

Часть преобразования и слияния была выполнена вручную. Это не лучшее решение, но сейчас оно работает.

Вот сценарий:

// get list of files from data directory $files = array_diff(scandir('./data'), array('.', '..')); foreach($files as $file): // get all data from the csv file and save in the $data array $csvFile = file('data/'.$file); $data = $list = []; foreach($csvFile as $line) { $data[] = str_getcsv($line); } unset($data[0]); // parse the data array and get the different sections: name. date and time foreach($data as $v) { $date = strtotime($v[1]); $list[date('d-m-Y',$date)][] = array( 'name'=>$v[0], 'date'=>date('d/m/Y',$date), 'in'=>$date ); } // create a new array and save parsed data in it with header columns $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) ); } // The name of a new file in the new directory using this file name $filename = str_replace('.csv', '', basename($file)); $fn = strtolower($filename.'-log.csv'); // open the file and output the new array as CSV $out = fopen('new/'.$fn, 'w'); foreach($new as $l) { fputcsv($out, $l, ",",'"'); } fclose($out); endforeach;
1
ответ дан 22 May 2018 в 19:57

Я преобразовал файлы в csv и использовал PHP-скрипт для анализа содержимого, создающего его, как я действительно хотел. Затем результат был сохранен в новом файле, затем эти файлы были преобразованы обратно в xls, затем объединены в один блокнот.

Часть преобразования и слияния была выполнена вручную. Это не лучшее решение, но сейчас оно работает.

Вот сценарий:

// get list of files from data directory $files = array_diff(scandir('./data'), array('.', '..')); foreach($files as $file): // get all data from the csv file and save in the $data array $csvFile = file('data/'.$file); $data = $list = []; foreach($csvFile as $line) { $data[] = str_getcsv($line); } unset($data[0]); // parse the data array and get the different sections: name. date and time foreach($data as $v) { $date = strtotime($v[1]); $list[date('d-m-Y',$date)][] = array( 'name'=>$v[0], 'date'=>date('d/m/Y',$date), 'in'=>$date ); } // create a new array and save parsed data in it with header columns $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) ); } // The name of a new file in the new directory using this file name $filename = str_replace('.csv', '', basename($file)); $fn = strtolower($filename.'-log.csv'); // open the file and output the new array as CSV $out = fopen('new/'.$fn, 'w'); foreach($new as $l) { fputcsv($out, $l, ",",'"'); } fclose($out); endforeach;
1
ответ дан 18 July 2018 в 09:17

Я преобразовал файлы в csv и использовал PHP-скрипт для анализа содержимого, создающего его, как я действительно хотел. Затем результат был сохранен в новом файле, затем эти файлы были преобразованы обратно в xls, затем объединены в один блокнот.

Часть преобразования и слияния была выполнена вручную. Это не лучшее решение, но сейчас оно работает.

Вот сценарий:

// get list of files from data directory $files = array_diff(scandir('./data'), array('.', '..')); foreach($files as $file): // get all data from the csv file and save in the $data array $csvFile = file('data/'.$file); $data = $list = []; foreach($csvFile as $line) { $data[] = str_getcsv($line); } unset($data[0]); // parse the data array and get the different sections: name. date and time foreach($data as $v) { $date = strtotime($v[1]); $list[date('d-m-Y',$date)][] = array( 'name'=>$v[0], 'date'=>date('d/m/Y',$date), 'in'=>$date ); } // create a new array and save parsed data in it with header columns $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) ); } // The name of a new file in the new directory using this file name $filename = str_replace('.csv', '', basename($file)); $fn = strtolower($filename.'-log.csv'); // open the file and output the new array as CSV $out = fopen('new/'.$fn, 'w'); foreach($new as $l) { fputcsv($out, $l, ",",'"'); } fclose($out); endforeach;
1
ответ дан 24 July 2018 в 19:17

Есть 2 сценария, которые вам нужны. Преобразующим из XLS в CSV является команда xls2csv, а другая - скрипт из github: csv2xls (другой csv2xls). Также есть csv2xlsx (и еще один csv2xlsx).

Между двумя преобразованиями вы можете редактировать файлы с помощью своего любимого инструмента.

Если вы хотите сделать это самостоятельно: файлы xlsx (и то же самое относится ODT (open / libeoffice) - это архивы с zip-файлами и содержат XML с данными. Затем вы можете разархивировать и данные в XML Манипулирование XML немного сложнее, чем CSV, но при автоматическом манипулировании он становится довольно эффективным.

2
ответ дан 22 May 2018 в 19:57
  • 1
    Привет, спасибо за указатель. Позвольте мне посмотреть, смогу ли я что-нибудь заработать. – Parto 1 August 2017 в 11:14

Есть 2 сценария, которые вам нужны. Преобразующим из XLS в CSV является команда xls2csv, а другая - скрипт из github: csv2xls (другой csv2xls). Также есть csv2xlsx (и еще один csv2xlsx).

Между двумя преобразованиями вы можете редактировать файлы с помощью своего любимого инструмента.

Если вы хотите сделать это самостоятельно: файлы xlsx (и то же самое относится ODT (open / libeoffice) - это архивы с zip-файлами и содержат XML с данными. Затем вы можете разархивировать и данные в XML Манипулирование XML немного сложнее, чем CSV, но при автоматическом манипулировании он становится довольно эффективным.

2
ответ дан 18 July 2018 в 09:17

Есть 2 сценария, которые вам нужны. Преобразующим из XLS в CSV является команда xls2csv, а другая - скрипт из github: csv2xls (другой csv2xls). Также есть csv2xlsx (и еще один csv2xlsx).

Между двумя преобразованиями вы можете редактировать файлы с помощью своего любимого инструмента.

Если вы хотите сделать это самостоятельно: файлы xlsx (и то же самое относится ODT (open / libeoffice) - это архивы с zip-файлами и содержат XML с данными. Затем вы можете разархивировать и данные в XML Манипулирование XML немного сложнее, чем CSV, но при автоматическом манипулировании он становится довольно эффективным.

2
ответ дан 24 July 2018 в 19:17
  • 1
    Привет, спасибо за указатель. Позвольте мне посмотреть, смогу ли я что-нибудь заработать. – Parto 1 August 2017 в 11:14

Другие вопросы по тегам:

Похожие вопросы: