LoginSignup
1
4

More than 3 years have passed since last update.

ウィークリーエクスポートサービスで抽出した添付ファイル一式から特定のファイルを掘り出す方法

Posted at

技術ブログというより日記です。
そもそもなんでそんなことする必要が出たかというと・・・。

AppExchangeのAアプリ⇒Bアプリ乗り換えのためデータ移行したい

Salesforseカスタムオブジェクトでデータを蓄積していくA社さんから
同じくカスタムオブジェクトへ蓄積していくB社さんへの乗り換えをすることになりました。
幸いデータは2万件弱なんですけども面倒なのが添付の画像ファイル。

念のためB社さんに「A社さんから移行された事例はお持ちではありませんかネー?」と資料をおねだりしてみるも
残念ながら、お詳しくないとのことー。
開発に確認するって言ってるうちに、こっちで調べてやってしまうことに。

ひとまず、A社さんは「添付ファイル」すなわちAttachimentに画像を入れて、本文レコードへ紐づけ。
B社さんは「コンテンツドキュメント」ContentsDocumentに画像を保存していることがわかりました。

会社全体の本文レコードをごっそり引っ越したいので、
添付ファイルは「ウィークリーエクスポートサービス」機能を使ってダウンロードすることにします。

ウィークリーエクスポートサービスでのデータ抽出

画像をダウンロードしたいので下記の設定にチェックを入れ、
image.png

オブジェクトだけ選択してエクスポートスケジュールの日時になるのを待ちました・・・。

が、全オブジェクトに紐づく全ファイルが吐かれるんですね!!

まじかー・・・。50MB超のZipが何十個もできとるーーーーーーー!
そしてどのZipになんのファイルが入っているか、Attachimentのcsvにも書いてないし
一覧表のテキストも作ってくれないしで
全部展開してもいいですけど、とはいえ、何千という画像ファイル手で探したくないですし・・・
と思ってBat化する流れに。

Zipのなかから所定のファイル名を拾い出すBat

とりま、対象のファイル名はattachimentファイルで割れているので、
どこのZipから解凍すればいいかを探索する方法を考えます。
ちなみにマクロは重くてダメでした。(そりゃそうか)

なのでBat化を試みたんですが。
展開せずにZipのまま検索するコマンドはインストールが必要なものしか見つかりませんでした。
Unzipまたは7zipの利用が必要で、下記はUnzipのコマンドを使って書いたBatファイル。
Zipの中身を除くコマンドをfor文でひたすら回します。
 ※ほんとはもっとエレガントな方法もあるよなーきっと(゜-゜)

実際にはこのあと、一覧化したファイル名をもとに
フォルダコピーを繰り返す処理を足して使ってました。
完成形の公開はいつかするかもくらいで。

とりま、2万けんくらいならラップトップでもなんとか動くよ。

あと、コンテンツ系の移植は
もう一本Bulkアップデート用のBatも作ってアップロード作業しました。
(ガバナ制限とかマナー的には頻繁に利用しないべきかもですが)

コンテンツのアップロードをデータローダでやろうとすると1回1000件までの制限があってだるいので
1000件未満でリストと切って、自動でアップロードするやつです。
慣れないので一回目はちょっと苦労しましたが
一回作っちゃえば、後はポチるだけなので移行作業どんとこいになりました。

データローダのコマンドライン使用は便利そうなので、今後ちゃんとまとめたいですね。
Trailblazersの諸兄がすでに書いてそうですが。

@echo off

rem ------------------------------ 
rem 実行前準備作業フォルダのパスを記入

set folderpath=C:\Users\うにゃうにゃ\Documents\
set filepath=SmartViscaf__image_id__c.txt
rem ------------------------------

echo filepathの値:%filepath%
echo folderpathの値:%folderpath%

rem フォルダ内のZip一覧を作成
dir %folderpath% /O /B > %folderpath%ziplist.txt
echo ziplist maked

rem Unzipのフォルダへ移動
cd C:\Program Files (x86)\GnuWin32\bin

rem 一覧記載のZipをすべて検索するループ
for /f %%a in (%folderpath%ziplist.txt) do call :forcall %%a

goto :sub

:forcall
rem For文内でやりたい処理

rem 拡張子:文末3桁の切り出して大文字でそろえる
set ext=%*
set ext=%ext:~-3%
set ext=%ext:z=Z%
set ext=%ext:i=I%
set ext=%ext:p=P%

rem 操作フォルダのパス設定
set zippath=%folderpath%%*

rem 吐き出しファイル名
set listname=list-%*.txt
set listname=%listname:.IP=%

rem 拡張子がZipなら処理実行
if "%ext%" == "ZIP" (

    rem Zip内のファイル名すべて書き出す
    unzip -l %zippath% > %folderpath%temp.txt

    echo temp%* maked

    rem ファイル名で該当するものを最終的な一覧に書き出す
    for /f "tokens=6 delims= " %%a in (%folderpath%temp.txt) do call :makefilelist %%a

)

goto :eof

:makefilelist
rem For文内でやりたい処理 2
set filename=%*
set filename=%filename:Attachments/=%
echo ファイル名摘出:%filename%


for /f %%b in ( %folderpath%%filepath%) do (
    if "%%b" == "%filename%" (    
        echo %filename% >> %folderpath%%listname%

    )
)
goto :eof

:sub
rem '''終了処理
del %folderpath%temp.txt
del %folderpath%ziplist.txt

pause
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4