元のCSVを保持せずにCSVファイルを分割する

元のCSVを保持せずにCSVファイルを分割する

大きなCSVファイルがあり、それをより小さなチャンクに分割したいと思います。以下を使用してCSVファイルを分割できることを知っています。

split -l 1000000 file.csv new

その結果、1,000,000行の部品が作成されます。ところが問題は割れたが原本も存在するという点だ。ディスク容量が不足しているため、元のファイルを保存せずにCSVを分割する方法はありますか?助けてくれてありがとう。よろしくお願いします。

答え1

stat(1)1つの方法はGNUとGNUを仮定することですtruncate(1)

#! /bin/sh

lines=1000000

size=$( wc -l "$1" | awk '{print $1}' )
tail=$(( size % lines ))
count=$(( size / lines ))

if [ $tail -ne 0 ]; then
    let count++
fi           

while [ $count -gt 0 ]; do
    start=$(( (count - 1) * lines + 1 ))
    fn=$( printf '%s_%05d' "$1" $count )
    sed -n $start,\$p <"$1" >"$fn"
    size_last=$( stat -c %s "$fn" )
    truncate -s -$size_last "$1"
    let count--
done

GNUがなければ、coreutilsPerlでも同じことができます。

lines元のファイルはこのプロセスで失われるため、最初にいくつかの小さなファイル(たとえば100に設定)について上記をテストすることをお勧めします。

答え2

システムメモリがファイル全体をcsv保存するのに十分な大きさである場合は、次のことを試すことができます。非常に危険ファイルを一時ファイルシステム(RAMの仮想ハードドライブなど)に配置し、そこからハードドライブに分割し始める方法。

PCの電源が切れると、ファイルはtmpfsここにあります。データが失われます!あなたを不幸にするのはとても簡単です。

通常、すでにそこにあるはずです。 aがにインストールされているとリストされていることを再確認して、/dev/shm次の手順を実行します。mount | grep shmtmpfs/dev/shm

mv file /dev/shm
split -l 1000000 /dev/shm/file /path/to/split/directory/

私はメモリ使用量に慣れていないので、ファイルサイズに加えてどのくらいの追加メモリが必要かわかりませんが、split分割する行が少なくとも100万個あるとします。

再びデータ損失に備えて単純な停電や予期しない状況。

PS:一時ファイルシステムとして使用できるUSBフラッシュドライブがあるかもしれません。それほど危険ではありませんが、遅いです。

答え3

CSVフィールドの順序を変更できる場合は、次のことを試すことができます。

SIZ=$(stat -c %s input)
tac input |\
(
  IFS=""
  while read -r LINE
  do
    ADJ=${#LINE}
    SIZ=$(( (SIZ-ADJ-1) ))
    truncate -s $SIZ input
    echo "$LINE"
  done
) |\
split -l 10 - output

また、通常のコマンドよりも実行するのに時間がかかりますが、長すぎることはsplitありません。

これは、実際にディスク容量を節約し、起動ファイルが利用可能なディスク容量のほぼ100%を占める場合にも機能します。

ファイル名を変更し、-l 10パラメータをsplit

関連情報