« Pantone Color Swatch | トップページ | 改行コード変更(仮) »

テキストファイルエンコード変換


【スクリプトエディタで開く】|

#!/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






|

« Pantone Color Swatch | トップページ | 改行コード変更(仮) »

AppleScript Text TSV」カテゴリの記事