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

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

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

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

1249閲覧

[Swift5]複数の配列の値を前から順に並べてcsvに出力したい。

Masa_teratail

総合スコア9

CSV

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/04/22 16:19

前提・実現したいこと

現在、Swift5でアプリを作成しています。
アプリ内で得られるデータを3つの配列に入れています。

var A: [Int] = [A0,A1,]
var B: [Int] = [B0,B1,
]
var C: [String] = [C0,C1,~]

これらの各配列を前から順番に1つに結合し、

dataString: String = A0,B0,C0,A1,B1,C1,~

結合した文字列を3つごとに改行してCSVに出力して保存したいと考えています。
A0 B0 C0
A1 B1 C1
~

発生している問題・エラーメッセージ

これらを実装するために以下のコードを書きましたが、配列の最後の値(Ax,Bx,Cx)しかcsvに保存されません。

該当のソースコード

Swift5

1 var dataArray = [String]() 2 3 while rowCount < self.aArray.count { 4 5 dataArray = [String(describing: self.aArray[rowCount]),String(describing: self.bArray[rowCount]),self.cArray[rowCount]] 6 7 rowCount = rowCount + 1 8 9 do { 10 11 var dataString = "" 12 dataString = dataArray.joined(separator: ",") 13 14 let path = NSHomeDirectory() + "/Documents/data.csv" 15 16 try dataString.write(toFile: path, atomically: true, encoding: String.Encoding.utf8) 17 18 } catch let error as NSError { 19 20 print("保存に失敗しました。: (error)") 21 22 } 23 } 24 25 }) 26 27 let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler:{ 28 (action: UIAlertAction!) -> Void in 29 30 print("キャンセルしました") 31 32 }) 33 34 saveAlert.addAction(defaultAction) 35 saveAlert.addAction(cancelAction) 36 37 present(saveAlert, animated: true, completion: nil) 38 39 } 40

試したこと

いろいろとコードを書いてみたのですが、配列の最初の値のみが保存されたり、Index out of rangeでアプリが落ちたりして、解決策がみつかりません。
ご助言をお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

CSVの作成と書き込みを同時に行わず別々に行ったほうが見通しが良いと思います。

swift

1do { 2 // CSVの作成 3 let csv = zip(zip(aArray, bArray), cArray) 4 .map { nums, str in "(nums.0), (nums.1), (str)" } 5 .joined(separator: "\n") 6 7 // 保存 8 let path = NSHomeDirectory() + "/Documents/data.csv" 9 try csv.write(toFile: path, atomically: true, encoding: String.Encoding.utf8) 10} 11catch { 12 print("保存に失敗しました。: (error)") 13}

投稿2020/04/23 01:27

MasakiHori

総合スコア3391

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

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

Masa_teratail

2020/04/23 07:26

教えていただいた方法で目的を達成することができました。 今回の目的にピッタリ合ったzipメソッドの存在を知ることができ、とても勉強になりました。 どうもありがとうございました。
guest

0

writeメソッドは現存しているファイルの有無を確認することなく上書きして書き込むようです。なので、書き込みたい文字列を全て準備してから書き込む必要があります。

ということなので、もし現在のコードをなるべく活かすのであれば、dataStringを毎行ごと書き出すのではなく、dataStringに全ての行を追加してから、writeメソッドで書き出す方法もあると思います。

投稿2020/04/22 23:28

TsukubaDepot

総合スコア5086

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

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

Masa_teratail

2020/04/23 07:28

ありがとうございました。 まさにご指摘の点が問題になっていました。 とても勉強になりました。
guest

0

ファイルの書き込みで追記してないので、最後のデータで上書きしているので一行分しか残ってないのだと思います。

ファイルへの追記

ファイルに保存したということはそのファイルを読み込んでまた配列データにするのでしょうか?
もしそうであれば、汎用的なCSVファイルの読み込みと書き込みのコードがあります。
参考にどうぞ。
CSVファイルの汎用的な読み書き

投稿2020/04/22 17:46

freemann

総合スコア264

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

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

Masa_teratail

2020/04/23 07:29

ありがとうございました。 まさにご指摘の点が問題になっていました。 csvファイルの扱いも勉強してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問