2017-04-01 7 views
0

"Hi;Test;Pen"のようなテキストを.csvファイルに追加したいとします。Swiftの.csvデータにテキストを追加するには?

Xcodeプロジェクトに.csvのテキストを挿入するのにCSVImporterを使用しました。ここでは、コードが、私はそれのために使用しているされています

guard let VokabelPath = Bundle.main.path(forResource: ResourceExample, ofType:"csv") else { 
     debugPrint(ResourceExample + " not found") 
     return 
    } 
    let importer = CSVImporter<[String]>(path: VokabelPath, delimiter: ";") 
    let importedRecords = importer.importRecords { $0 } 
    for record in importedRecords { 
     self.Vokabeln.insert(record, at: self.Vokabelzähler) 
     self.Vokabelzähler += 1 
    } 

をしかし、私は

  1. にしたいいくつかの理由でファイル内のファイルへ
  2. 変更何かを何かを追加(例えば4行目で)
  3. ファイル内のテキストを削除します(例:filetext = ""

私はthis Tutoを使用しようとしました私はこのコードを作った:

let fileName = "Tasks.csv" 
let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName) 
var csvText = "Test;Example;Apple;Pen\n" 
do { 
    try csvText.write(to: path!, atomically: true, encoding: String.Encoding.utf8) 
} catch { 
    print("Failed to create file") 
    print("\(error)") 
} 


guard let VokabelPath = Bundle.main.path(forResource: "Tasks", ofType:"csv") else { 
    debugPrint("Tasks not found") 
    return 
} 
let importer = CSVImporter<[String]>(path: VokabelPath, delimiter: ";") 
let importedRecords = importer.importRecords { $0 } 
for record in importedRecords { 
    self.Vokabeln.insert(record, at: self.Vokabelzähler) 
    self.Vokabelzähler += 1 
    print(record) 
} 

しかし、彼は "タスクが見つかりません"だけを印刷します。私の間違いは何ですか?

私はあなたが私を助けることができると思います

は、ありがとうございます。

EDIT:

最初の回答をした人が書いた、私は、バンドル内のファイルを保存することはできません。彼は私に書かれた 私はNSSearchPathForDirectoriesInDomainsので、私は更新されている私のコードを使用する必要があり、これは動作します:

let DownloadPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString 
let VokabelPath = DownloadPath.appendingPathComponent("Tasks.csv") 
let InhaltData = Inhalt.data(using: .utf8) 
print(VokabelPath) 

FileManager.default.createFile(atPath: VokabelPath, contents: InhaltData, attributes: nil) 

let importer = CSVImporter<[String]>(path: VokabelPath, delimiter: ";") 
let importedRecords = importer.importRecords { $0 } 
for record in importedRecords { 
    self.Vokabeln.insert(record, at: self.Vokabelzähler) 
    self.Vokabelzähler += 1 
} 

しかし、私は一つのさらなる疑問を持っている: は、私は私のXcodeプロジェクトにいくつかの件のデータを肝炎と私はBundle.mainでそれらを得ることができます。しかし、私は1つの関数だけを使いたいので、NSSearchPathForDirectoriesInDomainsでそれらを得ることも可能ですか?

答えて

0

ファイルを変更するには、データをインポートし、必要な変更を加えてから、同じファイルにデータを書き戻して前のコンテンツを上書きする必要があります。これが一般的な変更方法です。ファイルに直接変更を加えることはありません。

それは意味がありますか?

もしそうであれば、あなたが指しているチュートリアル(CSVの作成と書き出しのためのチュートリアル)を簡単に変更し、修正を加えた後に元のファイルから読み込んだデータを書き戻すことができます。

ライブラリを使用したくないというご質問は、いつでも独自のCSVパーサーを作成できます。あなたがしなければならないことは一度に1行ずつファイルからテキストを読み込んだり、コンマで値を区切ったりするだけなので、それほど難しいことではありません。単純なパーサーは簡単ですが、より複雑なケースを考慮するともう少し労力がかかります。それはすべてあなたのユースケースと扱うデータのタイプに依存します。最も簡単な方法は、インポートするライブラリを使用してカスタムコードで出力することです。あなたの追加質問について

、次のコードが失敗した場合:

guard let VokabelPath = Bundle.main.path(forResource: "Tasks", ofType:"csv") else { 
    debugPrint("Tasks not found") 
    return 
} 

はその後、ファイル名(または拡張子)との問題のいずれかがあるか、あなたのリソースの一部としてファイルを含めていません。上記のコードは、リソース内の指定されたファイルのパスを取得するだけです。

上記のコードは、私がNSSearchPathForDirectoriesInDomainsに関して話していたコードとは異なります。の場合は、のファイルをアプリケーションから書き込みます。私はあなたのリソースにファイルを書き戻すことができないということを意味しました。代わりに、変更されたファイルをDocumentsフォルダに書き込まなければなりませんでした。希望を物事を明確にする:

+0

私はこれを試しましたが、私は新しいファイルを書き留めておきたい場合は、 'VarkabelPath = Bundle.main.path(forResource:ResourceExample、ofType:" csv ")else { debugPrint(ResourceExample + "not found") return } '私はエラーが発生します。 –

+0

バンドルパスに新しいファイルを書き込むことはできません:)バンドルは基本的にアプリケーションファイルです。変更することはできません。代わりに、新しいファイルをデバイスのサンドボックスドキュメントフォルダのパスに保存する必要があります。 NSSearchPathForDirectoriesInDomainsメソッドでドキュメントフォルダを取得し、作成する新しいCSVファイルのファイル名を追加することができます。 – Fahim

+0

これを行う方法はわかりません。私は私の質問を編集しました、私はあなたが今、私が間違っていたこと、そしてそれがうまくいかなければならないかの例を教えてくれることを願っています。ありがとうございました。 –

関連する問題