Importfunktion für csv Datei

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Importfunktion für csv Datei

    Hallo Zusammen,

    ich habe eine Exportfunktion erstellt, die mir Daten aus CoreData in eine CSV Datei schreibt. Hierzu geht der Filemanager auf und man kann die Aktion wählen funktioniert auch so weit. Nun will ich das selbe für eine Import Funktion machen und da stehe ich auf dem Schlauch, wie kann ich den Filemanager öffnen und nach der Datei suchen?
    Anbei der Code für die Export Funktion. Danke für den Denkanstoss

    C-Quellcode

    1. @IBAction func ButtonExportZeiten(_ sender: Any) {
    2. if let listen = LoadZeiten() {
    3. ListeZeiten = listen
    4. }
    5. var regionKommen:String = ""
    6. var regionGehen:String = ""
    7. let fileName = "Arbeitszeiten.csv"
    8. let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
    9. var csvText = "Kommen; Kommen Latitude; Kommen Longitude; Kommen Region; Gehen; Gehen Latitude; Gehen Longitude; Gehen Region; Status; GPS; Manuell; Typ\n"
    10. let count = ListeZeiten.count
    11. if count > 0 {
    12. for Zeile in ListeZeiten {
    13. if let kommenRegion = Zeile.region_kommen {
    14. regionKommen = kommenRegion
    15. }
    16. if let gehenRegion = Zeile.region_gehen {
    17. regionGehen = gehenRegion
    18. }
    19. let Latitude_KommenString = String(Zeile.latitude_kommen)
    20. let Latitude_Kommen = Latitude_KommenString.replacingOccurrences(of: ".", with: ",")
    21. let Longitude_KommenString = String(Zeile.longitude_kommen)
    22. let Longitude_Kommen = Longitude_KommenString.replacingOccurrences(of: ".", with: ",")
    23. let Latitude_GehenString = String(Zeile.latitude_gehen)
    24. let Latitude_Gehen = Latitude_GehenString.replacingOccurrences(of: ".", with: ",")
    25. let Longitude_GehenString = String(Zeile.longitude_gehen)
    26. let Longitude_Gehen = Longitude_GehenString.replacingOccurrences(of: ".", with: ",")
    27. let newLine = "\(Zeile.kommen!); \(Latitude_Kommen); \(Longitude_Kommen); \(regionKommen); \(Zeile.gehen!); \(Latitude_Gehen); \(Longitude_Gehen); \(regionGehen); \(Zeile.status!); \(Zeile.gps); \(Zeile.manuell); \(Zeile.typ!)\n"
    28. csvText.append(newLine)
    29. }
    30. do {
    31. try csvText.write(to: path!, atomically: true, encoding: String.Encoding.utf8)
    32. let vc = UIActivityViewController(activityItems: [path!], applicationActivities: [])
    33. vc.excludedActivityTypes = [
    34. UIActivity.ActivityType.assignToContact,
    35. UIActivity.ActivityType.saveToCameraRoll,
    36. UIActivity.ActivityType.postToFlickr,
    37. UIActivity.ActivityType.postToVimeo,
    38. UIActivity.ActivityType.postToTencentWeibo,
    39. UIActivity.ActivityType.postToTwitter,
    40. UIActivity.ActivityType.postToFacebook,
    41. UIActivity.ActivityType.openInIBooks
    42. ]
    43. present(vc, animated: true, completion: nil)
    44. } catch {
    45. print("Failed to create file")
    46. print("\(error)")
    47. logbuchSave(Ereignis: "Failed to create file \(error)")
    48. }
    49. }
    50. else {
    51. let alert = UIAlertController(title: "Keine Daten vorhanden",
    52. message: "Die Datenbank ist leer",
    53. preferredStyle: .alert)
    54. logbuchSave(Ereignis: "Keine Daten zum Exportieren vorhanden, Datenbank ist leer")
    55. let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    56. alert.addAction(cancelAction)
    57. present(alert, animated: true)
    58. }
    59. }
    60. func LoadZeiten() -> [DB_Zeiten]? {
    61. let request: NSFetchRequest<DB_Zeiten> = DB_Zeiten.fetchRequest()
    62. do {
    63. let result = try mgdContext.fetch(request)
    64. return result
    65. } catch {
    66. print(error.localizedDescription)
    67. }
    68. return nil
    69. }
    Alles anzeigen
  • Ich vermute einmal, dass Du auf iOS unterwegs bist?

    Meines Wissens hast Du grundsätzlich nur zwei Optionen:
    1. Präsentiere selber eine Dateiauswahl, indem Du die entsprechenden Verzeichnisse liest und z. B. in einer UITableView darstellst. Dann wird nach Selektion einer Zeile der Import der korrespondierenden Datei gestartet.
    2. Der Benutzer kann die CSV-Datei in einem anderen Programm (Mail-Anhang, Safari oder eben auch "Dateien") lange antippen und dann in Deiner App öffnen. hierzu mußt Du eine eigene Dateiendung in Deiner info.plist registrieren (vgl. CFBundleDocumentTypes) und in der passenden AppDelegate-Methode application:openURL:options: die Datei der übergebenen URL lesen / verarbeiten.
    Für den Reimport von Daten würde ich den zweiten Weg nehmen, er erscheint mir mehr "Apple-like"...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • So den Document type habe ich in der plist hinzugefügt, das funktioniert auch

    Quellcode

    1. <key>CFBundleDocumentTypes</key>
    2. <array>
    3. <dict>
    4. <key>CFBundleTypeName</key>
    5. <string>CSV Document</string>
    6. <key>LSHandlerRank</key>
    7. <string>Owner</string>
    8. <key>CFBundleTypeRole</key>
    9. <string>Viewer</string>
    10. <key>LSItemContentTypes</key>
    11. <array>
    12. <string>Damian-s.${PRODUCT_NAME:rfc1034identifier}</string>
    13. </array>
    14. </dict>
    15. </array>
    16. <key>UTExportedTypeDeclarations</key>
    17. <array>
    18. <dict>
    19. <key>UTTypeDescription</key>
    20. <string>CSV Document</string>
    21. <key>UTTypeConformsTo</key>
    22. <array>
    23. <string>public.data</string>
    24. </array>
    25. <key>UTTypeIdentifier</key>
    26. <string>Damian-s.${PRODUCT_NAME:rfc1034identifier}</string>
    27. <key>UTTypeTagSpecification</key>
    28. <dict>
    29. <key>public.filename-extension</key>
    30. <string>csv</string>
    31. <key>public.mime-type</key>
    32. <string>application/inventorytodo</string>
    33. </dict>
    34. </dict>
    35. </array>
    Alles anzeigen

    In der App Delegate habe ich folgende Funktion ergänzt, die bringt mir auch die URL mit


    Quellcode

    1. func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    2. if url.isFileURL {
    3. let path = url
    4. let file = url.lastPathComponent
    5. let filename = file.dropLast(4)
    6. let extention = "csv"
    7. let delimiter = ";"
    8. print("Filepath: \(path)")
    9. print("Filename: \(filename)")
    10. }
    11. return true
    12. }
    Alles anzeigen
    Jetzt habe ich nun folgendes Problem, wie öffne ich die Datei zum importieren, bzw müsste ich die geöffnete Datei nach dem Import aus der App löschen, da ich beim mehrfach öffnen im Dateinamen immer neuere Nummer bekommen zB. Text-1.csv
  • Marvin75 schrieb:

    Jetzt habe ich nun folgendes Problem, wie öffne ich die Datei zum importieren, bzw müsste ich die geöffnete Datei nach dem Import aus der App löschen, da ich beim mehrfach öffnen im Dateinamen immer neuere Nummer bekommen zB. Text-1.csv
    Da gibt es der Möglichkeiten viele. Ich würde die entsprechenden Methoden dataWithContentsOfFile: bzw. stringWithContentsOfFile: der Klassen NSData / NSString verwenden ... bei einem CSV wohl eher String. Dann kannst Du diese Instanz zum weiteren Parsen nutzen. Die verwendete Datei steht im Inbox-Unterverzeichnis von Documents, und Du musst sie nach erfolgreicher Verarbeitung selber wegräumen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • So jetzt habe ich den Import der CSV Datei hinbekommen. Jetzt habe ich noch eine Frage, was passiert mit der Datei wenn sie zur App gebracht wird, muss ich diese dann aus der App wieder entfernen oder passiert das von alleine?

    hier der Code in der App Delegate

    Quellcode

    1. func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    2. do {
    3. let path = url
    4. let file = url.lastPathComponent
    5. let filename = String(file.dropLast(4))
    6. let delimiter = ";"
    7. let lineEnd = "\n"
    8. var result: [[String]] = []
    9. if url.isFileURL {
    10. do {
    11. let csvData = try String(contentsOf: path, encoding: .utf8)
    12. result.removeAll()
    13. let rows = csvData.components(separatedBy: lineEnd)
    14. for row in rows {
    15. let columns = row.components(separatedBy: delimiter)
    16. result.append(columns)
    17. }
    18. }
    19. catch {
    20. print("Unable to import Data: \(error)")
    21. }
    22. if filename.range(of: "Logbuch") != nil {
    23. if result[0].count == 2 {
    24. result.removeFirst()
    25. result.removeLast()
    26. let alert = UIAlertController(title: "Logbuch Daten importieren? ", message: "Es wurden \(result.count) Einträge gefunden", preferredStyle: .alert)
    27. let saveAction = UIAlertAction(title: "Importieren", style: .default, handler: { action in
    28. do {
    29. self.showIndicator()
    30. var i = 0
    31. for zeilen in result {
    32. var datum = result[i][0].trimmingCharacters(in: .whitespacesAndNewlines)
    33. datum = String(datum.dropLast(6))
    34. let ereignis = result[i][1].trimmingCharacters(in: .whitespacesAndNewlines)
    35. let dateFormatter = DateFormatter()
    36. dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" //Your date format
    37. dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00") //Current time zone
    38. //according to date format your date string
    39. guard let date = dateFormatter.date(from: datum) else {
    40. fatalError()
    41. }
    42. let mgdContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    43. let newLog = NSEntityDescription.insertNewObject(forEntityName: "DB_Logbuch", into: mgdContext) as! DB_Logbuch
    44. newLog.datum = date
    45. newLog.ereignis = ereignis
    46. do {
    47. try mgdContext.save()
    48. }
    49. catch {
    50. print(error.localizedDescription)
    51. }
    52. i += 1
    53. if i >= result.count {
    54. self.hideIndicator()
    55. }
    56. }
    57. }
    58. catch {
    59. print(error.localizedDescription)
    60. }
    61. })
    62. let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
    63. do {
    64. result.removeAll()
    65. print("array geleert")
    66. }
    67. catch {
    68. print(error.localizedDescription)
    69. }
    70. })
    71. alert.addAction(saveAction)
    72. alert.addAction(cancelAction)
    73. self.window?.rootViewController?.present(alert, animated: true, completion: nil)
    74. }
    75. else {
    76. let alert = UIAlertController(title: "Falsche CSV Datei",
    77. message: "Bitte Datei überprüfen",
    78. preferredStyle: .alert)
    79. let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    80. alert.addAction(cancelAction)
    81. self.window?.rootViewController?.present(alert, animated: true, completion: nil)
    82. }
    83. }
    84. else {
    85. let alert = UIAlertController(title: "Falsche CSV Datei",
    86. message: "Bitte Datei überprüfen",
    87. preferredStyle: .alert)
    88. let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    89. alert.addAction(cancelAction)
    90. self.window?.rootViewController?.present(alert, animated: true, completion: nil)
    91. }
    92. }
    93. else {
    94. let alert = UIAlertController(title: "Falsche CSV Datei",
    95. message: "Bitte Datei überprüfen",
    96. preferredStyle: .alert)
    97. let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    98. alert.addAction(cancelAction)
    99. self.window?.rootViewController?.present(alert, animated: true, completion: nil)
    100. }
    101. }
    102. return true
    103. }
    104. }
    Alles anzeigen
  • Hallo Zusammen,

    mal eine Frage zum IOS13 und dem CSV Document Type. Hat sich da was verändert in IOS13, wenn ich nun auf eine CSV Datei drücke und diese Teilen möchte erscheint seit IOS13 meine App nicht mehr in der Liste. Vorher (IOS12.4......) ging das noch ganz normal mit der obigen info.plist.
    Hat das auch noch jemand?

    Gruß Marvin