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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Swift

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

Q&A

解決済

1回答

2693閲覧

csvファイルにデータが書き込まれない

yuuki_yui_

総合スコア14

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Swift

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

0グッド

0クリップ

投稿2018/05/20 09:55

加速度センサで取得した値をcsvファイルに出力したいのですが、作成できたcsvファイルに値が出力されません。

エラーは以下のように出ます。

Status bar could not find cached time string image. Rendering in-process.
/csvファイル func createcsv(acceleration: CMAcceleration){ let fm = FileManager.default //documents let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! let filePath = documentsPath + "/getdata.csv" if !fm.fileExists(atPath: filePath) { fm.createFile(atPath: filePath, contents: nil, attributes: [:]) } var X = acceleration.x var Y = acceleration.y var Z = acceleration.z let getdata = "(X),(Y),(Z)\n" do{ try getdata.write(toFile: filePath, atomically: true, encoding: String.Encoding.utf8) print("Success to Wite the File") }catch let error as NSError{ print("Failure to Write File\n(error)") } }

解決方法がお分かりの方、ご教授願います。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/05/20 16:57 編集

今実機が手元にないので試せなくて申し訳ないのですが。 let getdata = "\(X),\(Y),\(Z)\n" の下で、print(getdata) とするとどうなりますか? エラーについて:Xcode 9.3ですか? This bug is present in XCode 9.3, also it is resolved in 9.4 beta.とありますよ。
yuuki_yui_

2018/05/21 05:02

返信ありがとうございます。Xcodeのバージョンは9.4です。print(getdata)についてはコードを追加しても値は表示されません。
退会済みユーザー

退会済みユーザー

2018/05/21 07:27 編集

画面上にラベルがあれば、var X = xのラベル名称.text ?? ""; var Y = yのラベル名称.text ?? ""; var Z = zのラベル名称.text ?? ""; let getdata = X + Y +Zで動くかな? まあ、ダメダメ回答ですね。
yuuki_yui_

2018/05/21 07:00

画面上にラベルがあるので、var X = xValue.textとしましたが、Use of unresolved identifier 'xValue'と宣言をしていないとエラーが出ます。
guest

回答1

0

ベストアンサー

加速度計の値の取得はviewDidLoadの中で処理し、Label.textに設定済だとして。
CSVへの保存タイミングをどうするかがわからないので、ボタンを押した時にラベルの値を保存してみたところ、動きました。
とりあえず動きましたレベルですが、何かの足しにでもなればと思います。

やりたいことは定期的にデータを取得して配列に追加していくようなイメージでしょうか?

swift

1// ラベルのoutlet接続 2@IBOutlet weak var xValueLabel: UILabel! 3@IBOutlet weak var yValueLabel: UILabel! 4@IBOutlet weak var zValueLabel: UILabel! 5 6 7 8// ボタンタップ時にラベルの値を取得してCSVに保存する。 9@IBAction func saveCSV(_ sender: UIButton) { 10 let fm = FileManager.default 11 //documents 12 let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! 13 let filePath = documentsPath + "/getdata.csv" 14 if !fm.fileExists(atPath: filePath) { 15 fm.createFile(atPath: filePath, contents: nil, attributes: [:]) } 16 17 //let X = acceleration.x 18 //let Y = acceleration.y 19 //let Z = acceleration.z 20 //let getdata = "(X),(Y),(Z)\n" 21 22 let X = xValueLabel.text ?? "" 23 let Y = yValueLabel.text ?? "" 24 let Z = zValueLabel.text ?? "" 25 let getdata = X + Y + Z 26 27 print("getdata:",getdata) 28 29 do{ 30 try getdata.write(toFile: filePath, atomically: true, encoding: String.Encoding.utf8) 31 print("filePath:",filePath) 32 print("Success to Wite the File") 33 }catch let error as NSError{ 34 print("Failure to Write File\n(error)") 35 } 36 } 37

あまりにもアレだと思うので、2秒ごとに配列に加速度データ数値を追加して、ボタンを押したらCSVに変換してoutputするやつを置いときます。参考になる部分でもありましたら、ご自身のコードの中に取り入れてみでください。

swift

1import UIKit 2import CoreMotion 3 4class ViewController: UIViewController { 5 6 // ラベルのoutlet接続 7 @IBOutlet weak var xAccelValuLabel: UILabel! 8 @IBOutlet weak var yAccelValuLabel: UILabel! 9 @IBOutlet weak var zAccelValuLabel: UILabel! 10 11 // 加速度データを記憶する配列 12 var accelValueArray = [String]() 13 14 // creMotionManagerを生成する 15 let cmManager = CMMotionManager() 16 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 // Do any additional setup after loading the view, typically from a nib. 21 22 // queueを実行する間隔(2.0秒 ← 変更可能) 23 cmManager.deviceMotionUpdateInterval = 2.0 24 // queueで実行するcloure 25 let handler: CMDeviceMotionHandler = {(motionData: CMDeviceMotion?, error: Error?) -> Void in 26 self.motionAnimation(motionData, error: error as Error?) 27 } 28 // 更新で実行するqueueを登録してモーションセンサーをスタートする 29 cmManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: handler) 30 } 31 32 // デバイスモーションセンサーで定期的に実行するメソッド 33 func motionAnimation(_ motionData: CMDeviceMotion?, error: Error?) { 34 if let motion = motionData { 35 // x軸方向加速度 36 let accelX = motion.userAcceleration.x 37 xAccelValuLabel.text = String(accelX) 38 // y軸方向加速度 39 let accelY = motion.userAcceleration.y 40 yAccelValuLabel.text = String(accelY) 41 // z軸方向加速度 42 let accelZ = motion.userAcceleration.z 43 zAccelValuLabel.text = String(accelZ) 44 45 let geteData = "(accelX),(accelY),(accelZ)" 46 // 2秒毎に数値を配列に追加する 47 accelValueArray.append(geteData) 48 print("accelValueArray:",accelValueArray) 49 } 50 } 51 52 // accelValueArrayをCSVに変換して保存する 53 @IBAction func saveCSV(_ sender: UIButton) { 54 let fm = FileManager.default 55 //documents 56 let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! 57 let filePath = documentsPath + "/getdata.csv" 58 if !fm.fileExists(atPath: filePath) { 59 fm.createFile(atPath: filePath, contents: nil, attributes: [:]) } 60 61 // 配列をCSVに変換する 62 let getData = accelValueArray.map { "\"" + $0 + "\"" }.joined(separator: ",") 63 64 do{ 65 try getData.write(toFile: filePath, atomically: true, encoding: String.Encoding.utf8) 66 print("Success to Wite the File") 67 print("getData:",getData) 68 print("filePath:",filePath) 69 }catch let error as NSError{ 70 print("Failure to Write File\n(error)") 71 } 72 } 73 74 override func didReceiveMemoryWarning() { 75 super.didReceiveMemoryWarning() 76 // Dispose of any resources that can be recreated. 77 } 78} 79

投稿2018/05/21 14:41

編集2018/05/21 18:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuuki_yui_

2018/05/22 09:30

とてもご丁寧に、ありがとうございます。 参考になる部分を追加してみよう、と思ったのですがCSVファイルに数値が出力されませんでした。print("accelValueArray:",accelValueArray)の部分の出力は問題なかったです。エラーもありませんでした。 Window > Device and Simulators > 設定 > Download Container でダウンロードし、Appdata下のDocumentsを確認をしているのですが、確認方法が間違っているのでしょうか。
退会済みユーザー

退会済みユーザー

2018/05/22 10:09

ファイルの確認はそれでできると思います。 CSVファイルが存在しないということでしょうか? 存在しないならば、CSVファイルの保存をしていないか、保存に失敗したということではないでしょうか? CSVの保存はどのようにしてコードに追加しましたか? 自分の書いたコードの場合はボタンをタップしたら、CSVを保存するようにしてあって、保存成功すると、 print("Success to Wite the File") print("getData:",getData) print("filePath:",filePath) をコンソールに表示するので、Window > Device and Simulators > 設定 > Download Containerでダウンロードした.xcappdataを参照すると、Appdata下のDocumentsにgetdata.csvが存在してる状態です。 CSVの保存まわりのコード try getData.write(toFile: filePath, atomically: true, encoding: String.Encoding.utf8) がどうなっているか確認してみてください。
yuuki_yui_

2018/05/22 11:55

CSVファイルは保存できていて、確認をしてみたのですがどこが悪いのかわからず、再起動をして実行してみたらうまくいきました。本当に丁寧にありがとうございました。
退会済みユーザー

退会済みユーザー

2018/05/22 12:45

保存できてよかったですね。 再起動で治りましたか、的はずれな指摘をしてしまいごめんなさい。
yuuki_yui_

2018/05/24 00:52

とんでもありません。ここまで丁寧に教えていただき、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問