SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




automatischer Import aus einer CSV in eine Liste

Unbeantwortet Dieser Beitrag hat 31 Antworten

Ohne Rang
302 Beiträge
Ardenda erstellt 2 Sept. 2013 17:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

hat mir hier jemand einen Tipp, wie ich einen TIme Job baue, damit dieser dann eine CSV in eine Liste importiert?

Die CSV ist in Kommas getrennt wobei eine Kommastelle eine Spalte repräsentiert.

Finde leider vermehrt Powershell Skripts, möchte das aber über einen Timer-Job lösen.

Hinweis: Kein Powershell skript oder Drittanbieter tool.

Alle Antworten

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 2 Sept. 2013 20:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi,

hier sind Links die dich zum erwünschten Ergebnis führen sollten:

How To (Custom Timer Job):
http://dotnetfinder.wordpress.com/2010/07/24/creatingcustomsharepointtimerjob2010/

How To (CSV-Datei)
http://tech.pro/tutorial/612/building-a-simple-csv-parser-in-csharp

Dann halt noch den Listenimport und alles sinnvoll kombinieren.

P.S.: Warum kein PowerShell?

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 19 Sept. 2013 11:41
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie wäre das zu Kombinieren mit Powershell?

Ohne Rang
391 Beiträge
Frank Daske Als Antwort am 3 Sept. 2013 11:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

für alle die mit erprobten Tools und ohne Programmierung zurechtkommen, hier mal die Schritte ausführlich beschrieben.

Integration Inhalt Textdatei / CSV in SharePoint Online / Office 365 (verwendet Windows Dienst zum Datenabgleich):
http://www.layer2.de/en/community/FAQs/cloud-connector/Pages/Text-Sync-to-Office365.aspx

Integration Inhalt Textdatei / CSV in SharePoint on-premise (verwendet Timer Job zum Datenabgleich):
http://www.layer2.de/en/community/FAQs/BDLC/Pages/How-to-connect-text-file-to-sharepoint-list.aspx

Beste Grüße, Frank

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 19 Sept. 2013 11:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

bin gerade am überlegen wie ich das umsetze.

Wäre da auch der BDC gut? Ich habe ca. 400 000 Listeneinträge, die importiert und auf Änderungen überprüft werden.

 

Wenn ich eine CSV-Dateie nehme und ein Import mache, muss ich überprüfen, ob es schon diesen Eintrag gibt (Unique Identifier) oder ob dieser geändert wurde und dann importieren.

Was ist hier die beste vorgehensweise?

1 Schritt: CSV Import der Dateien

2. Schritt CSV Import erfolgt mit Überprüfung

 

Was ist hier besser? Ein CSV Import Via Powershell oder Code oder kann ich mich auch an den BDC dazu wenden. Vielleicht auch eher die CSV In eine SQL Datenabnk übertragen. Nur wie würde man da vorgehen?

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Sept. 2013 12:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn Du es per BDC lösen würdest, hättest Du nicht die Daten in SharePoint. Sie werden dort nur angezeigt wie eine Liste, aber nicht in SharePoint gespeichert.

Über die anderen Möglichkeiten des echten Imports wurde ja oben gesprochen...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 19 Sept. 2013 13:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Richtig aber man kann dennoch die Änderungen über die Liset vornehmen oder? Zusätzliche wäre ein Zugriff über eine Excel auf die Datenbank, worüber die Updates gefahern werden können.

Wäre das eine alternative?

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 19 Sept. 2013 13:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Würden dann auch Workflows drauf funktionieren? Oder geht das nur bei einem echten import. wie eingeschränkt wäre ich bei einem solchen vorgang.

Wie sieht es da mit der performance aus bei einem Abgleich der Daten bei über 400 000 Datensätze? Nicht zuviel?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Sept. 2013 15:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Bei einer Anbindung per BDC könnte man die Daten natürlich auch in SharePoint editieren (wenn es die Datenquelle hergibt). Man kann die externen Daten auch mit anderen SharePoint-Daten verbinden (per Nachschlagefeld). Ob Workflows auf externen Listen funktionieren, weiß ich gerade nicht auswendig, aber ich glaube nicht.

[quote user="Ardenda"]Wie sieht es da mit der performance aus bei einem Abgleich der Daten bei über 400 000 Datensätze?[/quote]

400.000 Datensätze sind natürlich eine Menge Holz und nicht wirklich für eine einzige Liste geeignet. Da bekommt man allerdings auch mit BDC Probleme. Kannst Du die Daten nicht auf mehrere Listen aufteilen?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 19 Sept. 2013 15:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi,

danke für die Antwort. Leider sind alle Inhalte in einer Liste zu pflegen. Mir wäre gerade kein Weg wie ich diese trennen könnte.

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Sept. 2013 16:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann mußt Du zumindest über gefilterte Ansichten dafür sorgen, daß nur eine Teilmenge davon an die Oberfläche kommt. Die Ansichten müssen dabei über indizierte Spalten gefiltert werden.

In der Zentraladministration kann eingestellt werden, daß ein Admin mehre Elemente auf einmal bekommt. Und man kann ein Zeitfenster angeben, zu dem auf mehr Elemente zugegriffen werden kann. Das kann der import dann nutzen.

Man könnte dort auch den allgemeinen Schwellenwert auf 400.000 setzen, aber das empfehle ich ausrücklich NICHT! Performancemäßig dürfte das alles kein Problem sein - wenn es sauber programmiert ist.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 19 Sept. 2013 17:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Bei den 400k Dateien handelt es sich um eine initial beladung. Danach werden nur noch deltas geliefert.

Beispiel:

CSV Datei mit angaben welche Dateien gelöscht werden sollen

CSV Datei mit angaben welche Datei sich geändert hat.

Mir geht es dann eher um die Abfrage-Logik und performance

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Sept. 2013 08:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie oben geschrieben: performancemäßig ist das kein Problem, wenn Du per Abfrage immer nur gezielt auf einige wenige Datensätze zugreifst.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 20 Sept. 2013 09:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich glaube aber ich werde probleme mit ansichten bekommen. Die User dürfen nur ihre eigenen Dateien sehen. Glaub da werden die Views spinnen bei solch einer abfrage

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 25 Sept. 2013 01:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

hi,

habe gerade so meine ersten versuche einen Timerjob mit CSV Upload zu machen.

Kann mir hier jemand weiterhelfen was ich hier falsch mache? Hier mein code:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Microsoft.SharePoint.Administration;

using Microsoft.SharePoint;

using System.Globalization;

using System.Collections;

using System.IO;

 

namespace SharePointCSVImport

{

    class CSV_Import : SPJobDefinition

    {

 

        public CSV_Import()

 

            : base()

        {

 

        }

 

        public CSV_Import(string jobName, SPService service, SPServer server, SPJobLockType targetType)

 

            : base(jobName, service, server, targetType)

        {

 

        }

 

        public CSV_Import(string jobName, SPWebApplication webApplication)

 

            : base(jobName, webApplication, null, SPJobLockType.ContentDatabase)

        {

 

            this.Title = "CSV-Importer";

 

        }

 

        public override void Execute(Guid contentDbId)

        {

 

            // get a reference to the current site collection's content database

 

            SPWebApplication webApplication = this.Parent as SPWebApplication;

 

            SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId];

 

            // get a reference to the "ListTimerJob" list in the RootWeb of the first site collection in the content database

 

            SPList myList = contentDb.Sites[0].RootWeb.Lists["MyList"];

 

            StreamReader file;

            string contents = string.Empty;

            string line;

            string filePath = "http://sp2010/sites/Sharepointdev/Shared%20Documents/csv.csv";

            using (SPSite site = new SPSite(filePath))

            {

                using (SPWeb web = site.OpenWeb())

                {

                    SPFile spfile = web.GetFile(filePath);

 

                    if (spfile.Exists)

                    {

                        file = new StreamReader(spfile.OpenBinaryStream());

                        while ((line = file.ReadLine()) != null)

                        {

                            char[] splitter = { ',' };

                            String[] Array = line.ToString().Split(splitter);

 

                            // Now we got all the columns of the first line. Next add them to the  new list Item

 

 

 

                            SPItem newEntry = myList.Items.Add();

                            newEntry["Titel"] = Array[0];

                            //newEntry["Col2"] = Array[1];

                            //newEntry["Col3"] = Array[2];

                            newEntry.Update();

                            myList.Update();

                        }

                    }

 

 

                }

 

 

 

            }

        }

    }

}

CSV liegt in einer Library und ich möchte diese in eine Liste importieren (myListe).

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Sept. 2013 08:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Und was genau funktioniert jetzt nicht?

Nur eine Anmerkung: greife nicht über SPContentDatabase[index] auf die Site zu. Du kannst nicht sicher sein, daß die gewünschte Site einen festen Index hat. Benutze lieber den Konstruktor von SPSite mit einer festen URL (so wie beim Zugriff auf myList). Ganz ohne den Umweg der WebApp und DB.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 25 Sept. 2013 09:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

hi Andi,

irgendwie macht der gar nichts und bekomme es nicht debugged. Stimmt der code aber sonst an sich?

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 26 Sept. 2013 00:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok habe nun herausgefunden wie man das debugged. nun bekomme ich in meiner SP-List Abfrage ein Null raus. Kann mir einer sagen wieso?

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 26 Sept. 2013 00:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

habe es mal ein wenig mit dem versucht:

 

http://spdailytips.blogspot.de/2012/06/programmatically-add-data-from-csv-file.html

 

aber bekomme da nur Fehlermeldungen. Bin halt doch noch absoluter anfänger was dies anbelangt. kann mir da jemand helfen :-(?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Sept. 2013 12:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Tut mir leid, aber solange Du nicht beschreibst was funktioniert und was nicht, kann man auch keine wirkliche Hilfestellung geben. Und die komplette Lösung wird Dir hier wohl keiner bauen ;-)

Dein Code von oben sieht jedenfalls einigermaßen in Ordnung aus (bis auf meine Anmerkung von oben).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
391 Beiträge
Frank Daske Als Antwort am 30 Sept. 2013 12:44
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

für diejenigen, die eine Lösung zur Verbindung von Text/CSV-Dateien (exportiert aus beliebigen Systemen) mit echten SharePoint Listen ohne Programmierung bevorzugen und mit 3rd Party Tools zurechtkommen, ist hier eine fertige Lösung beschrieben:

http://www.layer2.de/en/community/FAQs/BDLC/Pages/How-to-connect-text-file-to-sharepoint-list.aspx

Das Produkt kann natürlich auch mit nahezu beliebigen anderen Datenquellen verbinden.

MfG, Frank

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 30 Sept. 2013 13:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Frank,

Du hattest das in diesem Thread bereits angepriesen. Der OP will es aber offenbar selbst in den Griff bekommen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 10 Okt. 2013 23:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

 

habe mal die Datei hochgeladen. Bin in Sachen C # halt doch ein Neuling. Kannst du mir da helfen? Ich finde den Fehler nicht.

Hier mal meine Solution 

http://sharepointcommunity.de/members/Ardenda/files/SharePointCSVImport.zip.aspx

 

Würdest damit mir echt super helfen.

 

Gruß

 

Ardenda

 

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 10 Okt. 2013 23:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

 

Würdest damit mir echt super helfen.

 

Habe mal das CKS Dev Toolkit eingebunden. ist eine herbe erleichterung

Gruß

 

Ardenda

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Okt. 2013 08:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dein Dateilink funklioniert nicht. Ich habe allerdings eh keine Zeit das detailliert zu untersuchen. Sowas mache ich für Kunden, die mich dafür bezahlen ;-)

Versuche also den Fehler selbst zu finden oder zumindest näher einzugrenzen, damit Du gezielter fragen kannst. Eine Frage nach dem Motto "Warum kann ich mit diesem Code die Datei nicht öffnen" läßt sich meist sehr viel einfacher (und schneller) beantworten und solche Antworten bekommst Du dann auch umsonst. Vielleicht hast Du auch Glück und jemand anderes hier nimmt sich dem an...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 11 Okt. 2013 08:58
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

habe es hinbekommen. Das CKS Dev Toolkit hat mir sehr geholfen um das zu debuggen. Er hat irgendwie noch ein alten Pfad zu einer alten Sitecollection gehabt, die ich aber nicht mehr verwendetete und konnte somit nicht die Liste finden.

 

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 14 Okt. 2013 19:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

So bin nun ein gutes stückchen weiter :-).

Der Import funktioniert nun und ich möchte nun das ein wenig erweitern über eine Konfigurationsliste. in der Konfigurations-Liste definiere ich wo die CSV-Import-Liste liegt und wo die CSV ausgelesen wird.

Nur bekomme ich leider eine Fehlermeldung beim "SPList list = web.Lists[stringListname];". Ich bekomme zwar den Listennamen aus meiner Konfigurationsliste aber danach kommt "Object reference not set to an instance of an object.".

Findet ihr hier auf den ersten Blick den Fehler? Mach schon wieder ewig rum

 

Hier mal der Code

 class CSV_Import
    {


        public static void startCsvImportMain(string stringCsvImportPath, string stringWeb, string stringListname)
        {

            SPSite site = default(SPSite);
            SPWeb web = default(SPWeb);

            // If in debug mode, trigger a false assertion to give time
            // to attach the debugger to the OWSTIMER.EXE process.
            try
            {


                string contents = string.Empty;
                string line;


                StreamReader file;
                SPList list = web.Lists[SASstringListname];
                SPFieldCollection fields = list.Fields;

                foreach (SPListItem item in list.Items)
                {

                    stringListname = item["Liste"].ToString();

                    // get a reference to the "ListTimerJob" list in the RootWeb of the first site collection in the content database


                    using (site = new SPSite(stringWeb))
                    {

                        using (web = site.OpenWeb())
                        {

                            SPFile spfile = web.GetFile(stringWeb);

 

                            if (spfile.Exists)
                            {

                                file = new StreamReader(spfile.OpenBinaryStream());

                                while ((line = file.ReadLine()) != null)
                                {

                                    char[] splitter = { ',' };

                                    String[] Array = line.ToString().Split(splitter);

 

                                    // Now we got all the columns of the first line. Next add them to the  new list Item


                                    SPItem newEntry = list.Items.Add();

                                    newEntry["Title"] = Array[0];

                                    //newEntry["Col2"] = Array[1];

                                    //newEntry["Col3"] = Array[2];

                                    newEntry.Update();


                                    list.Update();

                                }

                            }

 

                        }


                    }

                }


            }

catch (Exception ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                web.Dispose();
                site.Dispose();
            }
        }

    }
}

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 15 Okt. 2013 08:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du versuchst per web.Lists[...] auf eine Liste zuzugreifen, aber zu dem Zeitpunkt ist web noch gar nicht initialisiert.

PS: die beiden Dispose() im catch-Block kannst Du Dir sparen, weil Du ja schön mit using arbeitest.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 15 Okt. 2013 11:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die Tips nun läufts :)

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 17 Okt. 2013 17:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut
Hallo zusammen,
habe noch einen anderen Problem, wo man mir weiterhelfen könnte. Gibt es eine Möglichkeit Felder unabhängig von ihren Feldtypen upzudaten? 
 
 
Fallbeispiel:
 
1. verschiedene CSV Dateien zum Import
2. Konfig wo man definiert wo welche Spalte importiert werden soll aus der csv
 
Problem:
 
Jede Spalte kann einen Unterschiedlichen Typ haben (Person or Group, Text, Datum etc.). Wie kann man das denn am besten konfigurieren, dass ich per CSV Update Liste update bzw. Items hinzufüge um unabhängig vom Feldtyp zu sein?
 
CSV Beispiel 1
 
Titel, User, Datum
 
Liste Beispiel 1
 
Titel = Text
User = Person or Group
Datum = Date
 
------------------------
 
CSV Beispiel 2
 
Titel, Schwierigkeitsgrad,Anzahl
 
Liste Beisliel 2
 
Titel = Text
Schwierigkeitsgrad = Auswahlfeld
Anzahl = Int
Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Okt. 2013 08:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das mußt Du wie auch immer selbst implementieren. Du kannst z.B. einem Datumsfeld keinen Text zuweisen, also mußt Du Dich im Code darum kümmern den richtigen Datentyp zu verwenden. Und dabei natürlich prüfen, ob in der CSV auch etwas passendes steht.

Viele Grüße
Andi
af @ evocom de
Blog