質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • Swift

    8991questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1340questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

CSVの表示方法は設定できるのか

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,386

shiratak

score 8

お世話になります。

アプリからメーラーを立ち上げ送信する際、配列の中身をCSVファイルに変換して添付したいと思っています。

func toCSV(input: [[String]]) -> String {
        return input.map {
            $0.map {
                $0.containsString(",") || $0.containsString("\"")
                    ? "\"" + $0.stringByReplacingOccurrencesOfString("\"", withString: "\"\"") + "\""
                    : $0
                }.joinWithSeparator(",")
            }.joinWithSeparator("\r\n")
    }

CSVに変換する方法はこちらのやり方で上手くいったのですが、パソコン側からファイルを開いてみるとデータが横並びになってしまい、困っています。
もし可能ならばパソコンで表示する際縦並びのデータ表示にしたいと思っているのですが、配列に保存している以上仕方がないことなのでしょうか?コードなどで指定できるのが理想なのですが、もし方法などがありましたらご教授ください。
乱文失礼いたします。よろしくお願いいたします。


補足です。

func onClickMailButton() {
        if MFMailComposeViewController.canSendMail() == false {
            print("Email Send Failed")
            return
        } 
            csvData += ([todoItem])
            sendMailWithCSV("メール件名", message: "メール本文", csv: csvData)

    }
func sendMailWithCSV(subject: String, message: String, csv: [[String]]) {
        let mailViewController = MFMailComposeViewController()
            mailViewController.mailComposeDelegate = self
        let toRecipients = ["メールアドレス"]
            mailViewController.setSubject(subject)
            mailViewController.setToRecipients(toRecipients)

        mailViewController.addAttachmentData(toCSV(csv).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!,mimeType: "csv", fileName: "sample.csv")
        self.presentViewController(mailViewController, animated: true) {}

    }

添付ファイルはこのように作成しています。
説明不足で申し訳ありません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2016/06/24 17:26

    添付するファイルをどのように作成しているか教えて下さい。

    キャンセル

回答 1

checkベストアンサー

0

 改行コード?

改行コードの問題だと思いますので、CSVを開くアプリケーションの改行設定を変更して下さい。
変更出来ない場合は、アプリ側で改行コードを変更して下さい。

 検証しました

let csv = [["hogehoge", "mogemoge"],["ほげほげ", "もげもげ"]]

これをメール送信しましたが、Macのテキストエディット、Windowsのメモ帳、ともに縦並びに表示されました。(最後の行に改行がありませんでしたが)

hogehoge,mogemoge
ほげほげ,もげもげ

 文字コード?

エクセルとUTF-8は相性が悪い(?)ようなので、シフトJISでエンコードしてあげましょう。

mailViewController.addAttachmentData(toCSV(csv).dataUsingEncoding(NSShiftJISStringEncoding, allowLossyConversion: false)!,mimeType: "csv", fileName: "sample.csv")

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/24 18:10

    検証結果を追記しました。

    キャンセル

  • 2016/06/27 17:17

    お世話になります。回答ありがとうございました。
    fuzzballさんの検証通りにこちらでも試してみたのですが、やはり横並びになってしまいました(確認作業はExcelで行っています)。

    >アプリ側で改行コードを変更してください
    CSVに変換する関数内で改行コードを記述してしまうということでしょうか?
    プログラミング経験が浅く、重ねて質問してしまいすみません。

    キャンセル

  • 2016/06/28 08:49

    Excelは使っていないのでLibreOfficeで開いてみましたが、キチンと縦に並びました。
    ↓な感じです。
    | hogehoge | mogemoge |
    | ほげほげ | もげもげ |

    ちなみに、テキストエディタで開いても横並びになってしまうのでしょうか?

    >>CSVに変換する関数内で改行コードを記述してしまうということでしょうか?
    すでにtoCSVの中に改行コード("\r\n")は入っていますし、変換後のテキスト(.csv)にもCRLFが入っています。

    これはプログラムの問題ではなく、エクセルの使い方の問題のような気がします。

    キャンセル

  • 2016/06/30 14:26

    返信が遅くなりすみません。コメントありがとうございます。

    >テキストエディタで開いても横並びになってしまうのでしょうか?
    メモ帳を使っての確認になってしまったのですが、縦並びに表示されていました。
    また、検証データを外部データとしてExcelで読み込ませたところ、キチンと縦に表示されました!(メールから直接開こうとすると文字化けしてしまうのですが;;)

    NSUserDefaultsで保存した値の配列を変換し、表示させようとすると起きてしまう現象?のようでした。縦並びの部分では解決です。お騒がせしました…。

    キャンセル

  • 2016/06/30 14:53

    >>検証データを外部データとしてExcelで読み込ませたところ
    これは、メールから一旦ダウンロードしてExcelで読み込んだということでしょうか?

    この辺詳しくないので当てずっぽうですが、mimeTypeを"text/csv"にしても変わらないでしょうか?

    キャンセル

  • 2016/06/30 15:08

    回答ありがとうございます!

    >メールから一旦ダウンロードしてExcelで読み込んだということ
    その通りです。
    直接開くとひらがな部分が文字化けしてしまいましたので…

    >myneTypeを"text/csv"にしても〜
    やってみましたが、特に何か変わったというふうではありませんでした。

    キャンセル

  • 2016/06/30 15:52

    ふと気づくと、いつの間にか改行問題から文字化け問題に変わってますね。
    ということは文字コードの問題ということで、「エクセル UTF-8」でググってみるとそれっぽいのが出てくる出てくるw
    結局、エクセルがタコということで。

    エンコード指定のところを NSShiftJISStringEncoding にしてシフトJISにしてやれば、メーラーから直接開いても大丈夫でした。(シフトJISに無い文字を使っているとダメですが)

    キャンセル

  • 2016/06/30 18:05

    エンコード指定のところをシフトJISにしたところ、文字化け問題は解決しました。
    話があっちこっちしてしまって本当にすみませんでした…

    改行問題についてですが、当方の勘違いかもしれないです…
    検証データの色々をやっているうちに気づいたのですが、これって、CSVで表示されるときは多次元配列の中の配列ごとに改行されますよね?

    hogehoge,mogemoge
    ほげほげ,もげもげ

    NSUserDefaultsで値を保存する際、多次元配列の[0]番目にばかりデータを入れていたので改行コードがあったとしても反映されなかったのでは…という気がしてきました
    (わかりにくい説明でごめんなさい;)

    これからもう一度コードを見直してみますが、だとしたらタコなのは質問者でした…本当にすみません…

    キャンセル

  • 2016/06/30 18:25

    なんとなく‥分かったような‥気が‥しなくもないですw
    改行の件はそういうことかも知れないですね。
    文字コードの件はエクセルということで。

    キャンセル

  • 2016/07/01 10:39

    説明不足であるにも関わらず丁寧に回答していただき、ありがとうございました!
    また何かありましたらよろしくお願いします…。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    8991questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1340questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。