テキストファイルエンコード変換
#!/usr/bin/env osascript
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
(*
com.cocolog-nifty.quicktimer.icefloe
テキストファイル
TSVやCSV javascriptの文字コードをまとめて変換します
選択ファイルと同じフォルダを保存先に選ぶと上書きになります
*)
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
use AppleScript version "2.8"
use framework "Foundation"
use framework "AppKit"
use scripting additions
property refMe : a reference to current application
##############################
#入力
##############################
#デフォルトロケーション ここではデスクトップ
set appFileManager to refMe's NSFileManager's defaultManager()
set ocidURLsArray to (appFileManager's URLsForDirectory:(refMe's NSDesktopDirectory) inDomains:(refMe's NSUserDomainMask))
set ocidDesktopDirPathURL to ocidURLsArray's firstObject()
set aliasDesktopDirPath to (ocidDesktopDirPathURL's absoluteURL()) as alias
###ダイアログを前面に出す
set strName to (name of current application) as text
if strName is "osascript" then
tell application "Finder" to activate
else
tell current application to activate
end if
#
set listUTI to {"public.text"}
set strMes to ("ファイルを選んでください") as text
set strPrompt to ("テキストファイルを選んでください\nファイルを選んでください") as text
try
set listFilePath to (choose file strMes with prompt strPrompt default location aliasDesktopDirPath of type listUTI with invisibles, showing package contents and multiple selections allowed) as list
on error
log "エラーしました"
return "エラーしました"
end try
if listFilePath is (missing value) then
return "選んでください"
end if
##############################
#エンコード選択
##############################
#ユーザー選択用のレコード
set recordEnc to {|NSISO2022JPStringEncoding|:(refMe's NSISO2022JPStringEncoding), |NSJapaneseEUCStringEncoding|:(refMe's NSJapaneseEUCStringEncoding), |NSShiftJISStringEncoding|:(refMe's NSShiftJISStringEncoding), |NSUTF8StringEncoding|:(refMe's NSUTF8StringEncoding), |NSUTF16LittleEndianStringEncoding|:(refMe's NSUTF16LittleEndianStringEncoding), |NSUTF16StringEncoding|:(refMe's NSUTF16StringEncoding), |NSUnicodeStringEncoding|:(refMe's NSUnicodeStringEncoding), |NSUTF32LittleEndianStringEncoding|:(refMe's NSUTF32LittleEndianStringEncoding), |NSUTF32StringEncoding|:(refMe's NSUTF32StringEncoding)} as record
#Dictに入れて
set ocidEncDict to refMe's NSMutableDictionary's alloc()'s initWithCapacity:0
ocidEncDict's setDictionary:(recordEnc)
#ダイアログ用にキー名称のみ取り出す
set ocidAllKey to ocidEncDict's allKeys()
#A-z順に並び替え
set ocidSortedAllKey to ocidAllKey's sortedArrayUsingSelector:("localizedStandardCompare:")
#リストにしてダイアログに渡す
set listSortedAllKey to ocidSortedAllKey as list
###ダイアログを前面に出す
set strName to (name of current application) as text
if strName is "osascript" then
tell application "Finder" to activate
else
tell current application to activate
end if
#
set strTitle to ("選んでください") as text
set strPrompt to ("保存エンコードを選んでください\nUTF16-32は通常LEを選んでください") as text
try
set listResponse to (choose from list listSortedAllKey with title strTitle with prompt strPrompt default items (item 5 of listSortedAllKey) OK button name "OK" cancel button name "キャンセル" without multiple selections allowed and empty selection allowed) as list
on error
log "エラーしました"
return "エラーしました"
end try
if (item 1 of listResponse) is false then
return "キャンセルしましたA"
else if (item 1 of listResponse) is {} then
return "キャンセルしましたB"
end if
#戻り値
set strResponse to (item 1 of listResponse) as text
#戻り値をキーにして値=この場合はテキストエンコードを取り出しておく
set ocidSetEnc to (ocidEncDict's valueForKey:(strResponse))
##############################
#保存先
##############################
#保存先用にユーザーが選択したファイルの最初のエイリアスを取得
set aliasFirstFilePath to (item 1 of listFilePath) as alias
#パスにして
set strFirstFilePath to (POSIX path of aliasFirstFilePath) as text
set ocidFirstFilePathStr to (refMe's NSString's stringWithString:(strFirstFilePath))
set ocidFirstFilePath to ocidFirstFilePathStr's stringByStandardizingPath()
set ocidFirstFilePathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidFirstFilePath) isDirectory:false)
#ファイルの親階層ディレクトリを取得して
set ocidContainerDirPathURL to ocidFirstFilePathURL's URLByDeletingLastPathComponent()
#エイリアスとしてダイアログに渡す
set aliasContainerDirPath to (ocidContainerDirPathURL's absoluteURL()) as alias
############
set strMes to "フォルダを選んでください" as text
set strPrompt to "フォルダを選択してください\n入力フォルダと同じフォルダを選択すると\n『上書き』になります" as text
try
###ダイアログを前面に出す
set strName to (name of current application) as text
if strName is "osascript" then
tell application "Finder" to activate
else
tell current application to activate
end if
#
set aliasResponse to (choose folder strMes with prompt strPrompt default location aliasContainerDirPath with invisibles and showing package contents without multiple selections allowed) as alias
on error
log "エラーしました"
return "エラーしました"
end try
#戻り値エイリアスをURLに
set strSaveDirPath to (POSIX path of aliasResponse) as text
set ocidSaveDirPathStr to (refMe's NSString's stringWithString:(strSaveDirPath))
set ocidSaveDirPath to ocidSaveDirPathStr's stringByStandardizingPath()
set ocidSaveDirPathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidSaveDirPath) isDirectory:true)
#上書きチェック
if aliasContainerDirPath = aliasResponse then
log "同じフォルダに保存しようとしています"
set strMes to "上書きを指定しました。\nファイルは上書きになります\nいいですか?" as text
try
###ダイアログを前面に出す
set strName to (name of current application) as text
if strName is "osascript" then
tell application "Finder" to activate
else
tell current application to activate
end if
#
tell application (POSIX path of (path to frontmost application))
set refResponse to (display alert ("【注意】:" & strMes) buttons {"OK", "処理中止"} default button "OK" cancel button "処理中止" as informational giving up after 20)
end tell
on error
log "エラーしました"
return "エラーしました"
error number -128
end try
if true is equal to (gave up of refResponse) then
return "時間切れですやりなおしてください"
error number -128
end if
if "処理中止" is equal to (button returned of refResponse) then
return "処理を中止しました"
end if
end if
##最初のファイル選択で選んだファイルの数だけ繰り返し
repeat with itemAliasFilePath in listFilePath
#入力ファイルパス
set aliasFilePath to itemAliasFilePath as alias
set strFilePath to (POSIX path of aliasFilePath) as text
set ocidFilePathStr to (refMe's NSString's stringWithString:(strFilePath))
set ocidFilePath to ocidFilePathStr's stringByStandardizingPath()
set ocidFilePathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidFilePath) isDirectory:false)
#ファイル名
set ocidFileName to ocidFilePathURL's lastPathComponent()
set strFileName to ocidFileName as text
###ファイルのテキストを読み込み
set listResponse to (refMe's NSString's alloc()'s initWithContentsOfURL:(ocidFilePathURL) usedEncoding:(refMe's NSUTF8StringEncoding) |error|:(reference))
set ocidReadString to (item 1 of listResponse)
#入力ファイルの文字コードが判定出来なかった場合
if ocidReadString = (missing value) then
return "文字コードを判定出来ませんでした : " & strFileName
end if
#出力先 保存先パス 選んだフォルダ+ファイル名
set ocidSaveFilePathURL to (ocidSaveDirPathURL's URLByAppendingPathComponent:(ocidFileName))
#保存
set listDone to (ocidReadString's writeToURL:(ocidSaveFilePathURL) atomically:(true) encoding:(ocidSetEnc) |error|:(reference))
if (item 1 of listDone) is true then
log "保存成功: " & strFileName
else
log "エラーが発生しました: " & strFileName
end if
end repeat
| 固定リンク
「Text TSV」カテゴリの記事
- ユーザー辞書作成支援スクリプト(追加辞書用テキストも作成するようにした)(2024.10.13)
- TSV2HTML TSVタブ区切りテキストをHTMLテーブルにする(少し修正)(2024.03.28)
- TSV行列入替(2024.03.28)
- TSV2AdobeXML タブ区切りテキストからAdobe Illustratorの変数印字用の『変数ライブラリ』を生成する(1ページに複数面付け版)(2024.03.06)
- TSV2AdobeXML タブ区切りテキストからAdobe Illustratorの変数印字用の『変数ライブラリ』を生成する(2024.03.06)