Swift CSV作成

Swiftで、Arrayから、CSV形式のStringを生成するコードを作成しました。

使い方は、headerに行の項目名などをCSV形式で指定し、arrayにCSVにしたいデータを指定して、コールすると返り値がCSV形式のStringとなります。

ただし、Swiftは内部的に文字コードUnicodeなので、出力するときは、dataUsingEncoding(NSShiftJISStringEncoding)のメソッドで、S-JISに変換してください。

struct MakeCSV {
    static func MakeCSV(header:String, array:AnyObject, footer:String)->String{
        var csv:String = ""
        let maxindex1st = array.count-1
        for(var i=0;i<=maxindex1st;i++){
            let row = array[i]
            var rowcsv :String = ""
            let maxindex2nd = row.count-1
            for(var j=0;j<=maxindex2nd;j++){
                if j != 0 {rowcsv = rowcsv + ","}//2列目以降は、先頭にコンマをつける
                var str:String = ""
                if(row[j] is String || row[j] is NSString){ //文字列の場合
                    //改行コードをCR+LFに
                    str = (row[j] as! String).stringByReplacingOccurrencesOfString("\r\n", withString:"\n", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
                    str = str.stringByReplacingOccurrencesOfString("[\r\n]", withString:"\r\n", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
                    //ダブルコーテーションをエスケープ
                    str = str.stringByReplacingOccurrencesOfString("\"", withString:"\"\"", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
                }else if(row[j] is NSDate){ //日付の場合
                    let dateFormatter = NSDateFormatter()
                    dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP")
                    dateFormatter.timeStyle = .MediumStyle
                    dateFormatter.dateStyle = .MediumStyle
                    str = dateFormatter.stringFromDate(row[j] as! NSDate) as String
                }else if(row[j] is NSNumber){  //NSNumberの場合
                    str = (row[j] as! NSNumber).stringValue
                }
                if str != "" { rowcsv = rowcsv + "\"" + str + "\"" }
            }
            csv = csv + rowcsv + "\r\n"
        }
        return header + "\r\n" + csv + footer
    }
}