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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

iOS

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

0回答

1403閲覧

iosアプリ 通信(ファイル送信)

ousama

総合スコア3

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

iOS

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

1クリップ

投稿2020/05/13 04:32

編集2020/05/13 05:04

iOSアプリの開発を行っています。
取得した加速度センサなどの値をcsvファイルとして実機のDocumentsに保存できています。
その保存しているファイルをローカルサーバにpostしたいと考えています。

自分自身でやってみたのですが、取得したデータをローカルサーバに送信することができていますが、CSVファイルで保存がうまくできていません。
取得したデータを保存するとファイルの一つのマスに全て値が入ってしまいます。

どのようにすれば良いでしょうか。教えていただきたいです。

ViewController.swift

1import UIKit 2import CoreMotion 3import simd 4 5class ViewController: UIViewController { 6 7 // Connection with interface builder 8 @IBOutlet weak var acc_x: UILabel! 9 @IBOutlet weak var acc_y: UILabel! 10 @IBOutlet weak var acc_z: UILabel! 11 12 @IBOutlet weak var gyro_x: UILabel! 13 @IBOutlet weak var gyro_y: UILabel! 14 @IBOutlet weak var gyro_z: UILabel! 15 16 @IBOutlet weak var gra_x: UILabel! 17 @IBOutlet weak var gra_y: UILabel! 18 @IBOutlet weak var gra_z: UILabel! 19 20 @IBOutlet weak var atti_roll: UILabel! 21 @IBOutlet weak var atti_pitch: UILabel! 22 @IBOutlet weak var atti_yaw: UILabel! 23 24 @IBOutlet weak var quat_x: UILabel! 25 @IBOutlet weak var quat_y: UILabel! 26 @IBOutlet weak var quat_z: UILabel! 27 @IBOutlet weak var quat_w: UILabel! 28 29 @IBOutlet weak var recordCsvButton: UIButton! 30 31 32 var deviceMotionUpdateInterval = 0 33 34 let csvManager = SensorDateCsvManager() 35 let format = DateFormatter() 36 37 // create instance of MotionManager 38 let motionManager: CMMotionManager = CMMotionManager() 39 40 41 override func viewDidLoad() { 42 super.viewDidLoad() 43 _=OperationQueue() 44 45 46 } 47 override func didReceiveMemoryWarning() { 48 super.didReceiveMemoryWarning() 49 50 @IBAction func tapStart(_ sender: Any) { 51 motionManager.deviceMotionUpdateInterval = 0.016666666 52 53 csvManager.startRecording() 54 55 getMotionDate() 56 } 57 @IBAction func tapStop(_ sender: Any) { 58 if motionManager.isDeviceMotionAvailable{ 59 motionManager.stopDeviceMotionUpdates() 60 } 61// self.csvManager.saveSensorDataToCsv(fileName: format.dateFormat) 62 csvManager.stopRecording() 63 format.dateFormat = "yyyy-MMdd-HHmmss" 64 let dateText = format.string(from: Date()) 65 showSaveCsvFileAlert(fileName: dateText) 66 } 67 68 //モーションセンサの取得 69 func getMotionDate(){ 70 if motionManager.isDeviceMotionAvailable{ 71 motionManager.startDeviceMotionUpdates(to:OperationQueue.current!, withHandler:{ 72 deviceManager, error in 73 let accel: CMAcceleration = deviceManager!.userAcceleration 74 self.acc_x.text = String(format: "%.2f", accel.x) 75 self.acc_y.text = String(format: "%.2f", accel.y) 76 self.acc_z.text = String(format: "%.2f", accel.z) 77 78 let gravity: CMAcceleration = deviceManager!.gravity 79 self.gra_x.text = String(format: "%.2f", gravity.x) 80 self.gra_y.text = String(format: "%.2f", gravity.y) 81 self.gra_z.text = String(format: "%.2f", gravity.z) 82 83 let gyro: CMRotationRate = deviceManager!.rotationRate 84 self.gyro_x.text = String(format: "%.2f", gyro.x) 85 self.gyro_y.text = String(format: "%.2f", gyro.y) 86 self.gyro_z.text = String(format: "%.2f", gyro.z) 87 88 let attitude: CMAttitude = deviceManager!.attitude 89 self.atti_roll.text = String(format: "%.2f", attitude.roll) 90 self.atti_pitch.text = String(format: "%.2f", attitude.pitch) 91 self.atti_yaw.text = String(format: "%.2f", attitude.yaw) 92 93 let quaternion: CMQuaternion = attitude.quaternion 94 self.quat_x.text = String(format: "%.2f", quaternion.x) 95 self.quat_y.text = String(format: "%.2f", quaternion.y) 96 self.quat_z.text = String(format: "%.2f", quaternion.z) 97 self.quat_w.text = String(format: "%.2f", quaternion.w) 98 99 100 if self.csvManager.isRecording { 101 self.format.dateFormat = "MMddHHmmssSSS" 102 103 var text = "" 104 105 text += String(accel.x) + "," 106 text += String(accel.y) + "," 107 text += String(accel.z) + "," 108 text += String(gravity.x) + "," 109 text += String(gravity.y) + "," 110 text += String(gravity.z) + "," 111 text += String(gyro.x) + "," 112 text += String(gyro.y) + "," 113 text += String(gyro.z) + "," 114 text += String(quaternion.x) + "," 115 text += String(quaternion.y) + "," 116 text += String(quaternion.z) + "," 117 text += String(quaternion.w) 118 119 self.csvManager.addRecordText(addText: text) 120 } 121 }) 122 } 123 } 124 125 func showSaveCsvFileAlert(fileName:String){ 126 let alertController = UIAlertController(title: "CSVデータを保存しまし", message: "名前を入力してください", preferredStyle: .alert) 127 128 let defaultAction:UIAlertAction = 129 UIAlertAction(title: "はい", 130 style: .default, 131 handler:{ 132 (action:UIAlertAction!) -> Void in 133 134 //テキストフィールドに入力したものを格納 135 let textField = alertController.textFields![0] as UITextField 136 self.csvManager.saveSensorDataToCsv(fileName: textField.text!) 137 }) 138 let cancelAction:UIAlertAction = 139 UIAlertAction(title: "いいえ", 140 style: .cancel, 141 handler:{ 142 (action:UIAlertAction!) -> Void in 143 self.showDeleteRecordedDataAlert(fileName: fileName) 144 }) 145 146 alertController.addTextField { (textField:UITextField!) -> Void in 147 alertController.textFields![0].text = fileName 148 } 149 alertController.addAction(defaultAction) 150 alertController.addAction(cancelAction) 151 152 present(alertController, animated: true, completion: nil) 153 } 154 155 func showDeleteRecordedDataAlert(fileName:String){ 156 let alertController = UIAlertController(title: "記録したデータを削除します", message: "削除してよろしいですか?", preferredStyle: .alert) 157 158 let defaultAction:UIAlertAction = 159 UIAlertAction(title: "はい", 160 style: .default, 161 handler:{ 162 (action:UIAlertAction!) -> Void in 163 // delete recorded data 164 }) 165 let cancelAction:UIAlertAction = 166 UIAlertAction(title: "いいえ", 167 style: .cancel, 168 handler:{ 169 (action:UIAlertAction!) -> Void in 170 self.showSaveCsvFileAlert(fileName: fileName) 171 }) 172 173 alertController.addAction(defaultAction) 174 alertController.addAction(cancelAction) 175 176 present(alertController, animated: true, completion: nil) 177 } 178}

SensorDateCsvManager.swift

1import Foundation 2 3//csvデータの保存のクラス 4class SensorDateCsvManager { 5 6 private(set) var isRecording = false 7 8 //csvファイルの文頭にある文字 9 private let headerText = "accelX,accelY,accelZ,gravityX,gravityY,gravityZ,gyroX,gyroY,gyroZ,quaternionX,quaternionY,quaternionZ,quaternionW" 10 private var recordText = "" 11 12 var format = DateFormatter() 13 14 15 init() { 16 format.dateFormat = "MMddHHmmssSSS" 17 } 18 19 func startRecording() { 20 recordText = "" 21 recordText += headerText + "\n" 22 isRecording = true 23 } 24 25 func stopRecording() { 26 isRecording = false 27 } 28 29 func addRecordText(addText:String) { 30 recordText += addText + "\n" 31 } 32 33 //csvデータの保存先 34 func saveSensorDataToCsv(fileName:String) { 35 36 let filePath = NSHomeDirectory() + "/Documents/" + fileName + ".csv" 37 38 do{ 39 try recordText.write(toFile: filePath, atomically: false, encoding: String.Encoding.utf8) 40 print("Success to Write CSV") 41 print(filePath) 42 tuusin() 43 44 45 }catch let error as NSError{ 46 print("Failure to Write CSV\n(error)") 47 } 48 } 49 50 func tuusin(){ 51 52 let url = URL(string: "http://×××.×××:8000") 53 var request = URLRequest(url: url!) 54 // POSTを指定 55 request.httpMethod = "POST" 56 // POSTするデータをBodyとして設定 57 request.httpBody = recordText.data(using: .utf8) 58 let session = URLSession.shared 59 session.dataTask(with: request) { (data, response, error) in 60 if error == nil, let data = data, let response = response as? HTTPURLResponse { 61 62 print("Content-Type: (response.allHeaderFields["Content-Type"] ?? "")") 63    print("statusCode: (response.statusCode)") 64 print(String(data: data, encoding: .utf8) ?? "") 65 } 66 }.resume() 67 68 } 69}
app = Flask(__name__) @app.route("/",methods=['POST','GET']) def hello(): data = request.form df=pd.DataFrame(data,index=['i',]) print(df) df.to_csv("〇〇.csv") return "Hello World!" if __name__ == '__main__': app.run(host="0.0.0.0", port=8000)

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

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

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

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

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

y_waiwai

2020/05/13 04:39

どこまで送信できてるんでしょうか。 取得したテキストデータだけ、とはどういうことでしょうか。 #CSVというのはテキストなんですが
ousama

2020/05/13 05:05

曖昧な表現が多くて申し訳ございません。内容を変更しましたのでよろしくお願いいたします。
TsukubaDepot

2020/05/13 05:07

送信できない、というのはどのようにして確認されたのでしょうか。また、データは「送受信」するものなので、受信側環境、送信側環境それぞれきちんと動作することを確認する必要もありますが、このあたりはどのような状況でしょうか。 また、前回のご質問が消されてしまっているため追えないのですが、受信側環境も独自に構築されたと記憶していますが、それはどのようにして作られたのでしょうか。 つまり、 1. 受信側(サーバ側)の構築環境 2. 受信側が正常に動作していることの確認方法 3. アプリ側がきちんと送信して「いない」ことを確認した方法 の確認についてもう少し知りたいところです。 受信側も独自に構築されたとなると追試は難しくなると思いますが、まずはこの辺りの条件をご質問に追記されてはいかがでしょうか。
ousama

2020/05/13 08:38

ご回答ありがとうございます。質問内容を少し変更いたししました。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問