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

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

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

3019閲覧

測定したデータをCSVファイルとしてOneDriveに送信したい

yuki84

総合スコア23

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/07/24 08:05

開発環境 Xcode9.4 / Swift4.1

以下のような、加速度センサで測定した値を配列に格納し、CSVファイルに変換し、メールに添付して送信するプログラムを作成しました。しかし、便宜上、CSVファイルを直接OneDriveに保存するように改善できないかと考えています。
調べたところ、こちらや、こちらのようにUIDocumentInteractionControllerやUIActivityViewControllerを使ってできそうだとは思ったのですが、CSVファイルの場合は具体的にどのようにコードを書いていけばいいのかわからない状態です。ご教示頂けますでしょうか。参考になるサイトやコードの一部だけでも教えていただければ幸いです。

swift

1import UIKit 2import MessageUI 3import CoreMotion 4 5class ViewController: UIViewController, MFMailComposeViewControllerDelegate { 6 7 @IBOutlet weak var xGyroLabel: UILabel! 8 @IBOutlet weak var yGyroLabel: UILabel! 9 @IBOutlet weak var zGyroLabel: UILabel! 10 11 let cmManager = CMMotionManager() 12 var csvData=[[String]]() //空の配列の定義 13 var dt=0.1 //ジャイロ取得時間間隔[s] 14 15 @IBAction func tapStart(_ sender: Any) { 16 17 // キューを実行する間隔(秒数) 18 cmManager.deviceMotionUpdateInterval = dt 19 20 // キューで実行するクロージャ 21 let handler:CMDeviceMotionHandler = {(motionData:CMDeviceMotion?, error:Error?) -> Void in 22 self.motionAnimation(motionData, error: error as NSError?) 23 } 24 // 更新で実行するキューを登録してモーションセンサーをスタートする 25 cmManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: handler) 26 27 } 28 29 @IBAction func tapStop(_ sender: Any) { 30 if (cmManager.isDeviceMotionActive) { 31 cmManager.stopDeviceMotionUpdates() 32 } 33 } 34 35 // デバイスモーションセンサーで定期的に実行するメソッド 36 func motionAnimation(_ motionData:CMDeviceMotion?, error:NSError?) { 37 if let motion = motionData { 38 39 // 現在時刻の取得 40 let formatter = DateFormatter() 41 formatter.timeZone = TimeZone.ReferenceType.local 42 formatter.dateFormat = "HH:mm:ss.SSS" // *時*分**.***秒 43 let date1=Date() 44 let dateStr = formatter.string(from: date1) 45 46 // X軸加速度 47 var accX = motion.userAcceleration.x 48 accX = -round(accX*1000)/1000 49 xGyroLabel.text = String(accX) 50 // Y軸加速度 51 var accY = motion.userAcceleration.y 52 accY = -round(accY*1000)/1000 53 yGyroLabel.text = String(accY) 54 // Z軸加速度 55 var accZ = motion.userAcceleration.z 56 accZ = -round(accZ*1000)/1000 57 zGyroLabel.text = String(accZ) 58 59 // 配列に格納 60 csvData.append([String(dateStr),String(accX),String(accY),String(accZ)]) 61 } 62 } 63 64 @IBAction func sendMail(_ sender: Any) { 65 //メールを送信できるかチェック 66 if MFMailComposeViewController.canSendMail()==false { 67 print("Email Send Failed") 68 return 69 } 70 sendMailWithCSV("データ", message: "", csv: csvData) 71 72 } 73 74 func sendMailWithCSV(_ subject: String, message: String, csv: [[String]]) { 75 76 let mailViewController = MFMailComposeViewController() 77 mailViewController.mailComposeDelegate = self 78 let toRecipients = ["*****"] //送信先アドレスの入力 79 80 mailViewController.setSubject(subject) 81 mailViewController.setToRecipients(toRecipients) 82 mailViewController.setMessageBody(message, isHTML: false) 83 mailViewController.addAttachmentData(toCSV(input: csv).data(using: String.Encoding.shiftJIS, allowLossyConversion: false)!,mimeType: "csv", fileName: "data.csv") //csvを添付、ファイル名の指定 84 self.present(mailViewController, animated: true) {} 85 } 86 87 //csv形式への変換 88 func toCSV(input: [[String]]) -> String { 89 return input.map { 90 $0.map { 91 $0.contains(",") || $0.contains("\"") 92 ? "\"" + $0.replacingOccurrences(of: "\"", with: "\"\"") + "\"" 93 : $0 94 }.joined(separator: ",") 95 }.joined(separator: "\r\n") 96 } 97 98 func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { 99 switch result { 100 case .cancelled: 101 print("キャンセル") 102 case .saved: 103 print("下書き保存") 104 case .sent: 105 print("送信成功") 106 default: 107 print("送信失敗") 108 } 109 dismiss(animated: true, completion: nil) 110 } 111 112 override func viewDidLoad() { 113 super.viewDidLoad() 114 // Do any additional setup after loading the view, typically from a nib. 115 } 116 117 override func didReceiveMemoryWarning() { 118 super.didReceiveMemoryWarning() 119 // Dispose of any resources that can be recreated. 120 } 121 122}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

参考URLを確認したところUIDocumentInteractionControllerはurlで送るファイルを取得するようなので
一度ファイルとして保存してからそのパスを指定するような方法ではどうでしょうか。

ファイルの保存については色々と情報があると思います。以下、ご参考までに。
Swiftでファイルの読み込みと保存

また、配列をcsvとして保存する方法は以前の質問にありましたのでそちらを参照すればできるかなと思います。
[swift4]配列をcsvファイルに格納する

投稿2018/07/24 09:07

razuma

総合スコア1313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki84

2018/07/25 01:46

回答ありがとうございます。参考リンクを見ながらとりあえずコードを書いて見たいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問