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
  • Mac & i Test Abo
  • 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.