特定のディレクトリに格納されているすべてのcsvファイルから、OO行までのデータを抜き出しておいて...と実務で頼まれました。
1〜2個くらいのファイルならすぐ終わるのですが、数十個もあるとかなり大変。
ファイルが多くてもshellを書くことで簡単に作業が終わったので、自分なりの備忘録としてメモしておきます。
今回は例として、デスクトップ上にあるすべてのcsvファイルから、「5行目までのデータ」をすべて抜き出してみます。なお、抜き出したデータは、同じcsv形式で、bkフォルダの中に格納していくものとします。
Macの場合 (.shファイル)
#!/bin/bash
# デスクトップパスの設定
desktopPath="$HOME/Desktop"
# 抜き出したデータのバックアップ先を指定
bkFolder="$desktopPath/bk"
# bkフォルダが存在しない場合は作成
if [ ! -d "$bkFolder" ]; then
mkdir "$bkFolder"
fi
# デスクトップ上のすべてのCSVファイルに対して処理を行う
for file in "$desktopPath"/*.csv; do
outputFile="$bkFolder/$(basename "$file" .csv)_bk.csv"
lineCount=0
# 5行目までの内容を新しいCSVファイルにコピー
while IFS= read -r line || [ -n "$line" ]; do
echo "$line" >> "$outputFile"
lineCount=$((lineCount + 1))
if [ "$lineCount" -ge 5 ]; then
break
fi
done < "$file"
done
echo "処理が完了しました!"
Windowsの場合 (.batファイル)
@echo off
setlocal enabledelayedexpansion
REM デスクトップパスの設定
set desktopPath=%USERPROFILE%\Desktop
REM 抜き出したデータのバックアップ先を指定
set bkFolder=%desktopPath%\bk
REM bkフォルダが存在しない場合は作成
if not exist "%bkFolder%" mkdir "%bkFolder%"
REM デスクトップ上のすべてのCSVファイルに対して処理を行う
for %%f in ("%desktopPath%\*.csv") do (
set "outputFile=%bkFolder%\%%~nf_bk.csv"
set /a lineCount=0
REM 5行目までの内容を新しいCSVファイルにコピー
>"%outputFile%" (
for /F "usebackq delims=" %%a in ("%%f") do (
echo %%a
set /a lineCount+=1
if !lineCount! geq 5 goto :breakLoop
)
)
:breakLoop
)
echo 処理が完了しました
面倒な作業はshellファイルでササッ...と終わらせましょう