Migrate csv to Drupal 6
am 10.05.2013 - 12:42 Uhr in
Hallo Drupalisten
Eigentlich komme ich aus der DotNet Ecke, darf aber neu Projekte in Drupal, IOS etc. entwickeln :-). Dies ist sehr spannend und leider zeigt die Lernkurve zu Beginn deutlich nach oben.
Teilprojekt Beschrieb:
Ich darf einen .csv Import to Drupal mit dem Migrate Modul Realisieren. Dieser Import wird pro Jahr etwa 1mio. Datensätze einlesen und nach Drupal migrieren. Soweit so gut.
Alle Columns aus dem .csv File sind als einzelne Taxonomien in Drupal 6.x angelegt und dem richtigen Inhaltstyp zugeordnet worden. Auf den Taxonomien sind die Tags aktiviert und es handelt sich bei allen Taxonomien um Pflichtfelder.
Der XDebug läuft, wie erwartet, durch die Implementierten Methoden.
Alle …_csv Columns enthalten die erwarteten Werte, wenn ich den Breakpoint bei „return true“ in der Funktion prepareRow($row) setzte.
Nun zu meinem Problem:
Interessant ist nun dass das mapping nur bei den Columns „Quelle Buchung“ und „Quelle Versicherung“ funktioniert und mir unter Inhalt die importierten Datensätze anzeigt. Die restlichen Spalten werden mit Leerstring befüllt. Sprich das mapping funktioniert nicht korrekt (einige Spalten werde importiert andere nicht (Gleicher Fehler in Englisch nur in MigrateDestinationTrem und nicht MigrateDestinationNode angewandt: )). Hat mir wer einen Tipp? Rechtschreibung bei dem Taxonomienamen sowie dem Taxonomi-Maschin_Name zum PHP-Code wurden bereits überprüft.
<?php
/**
* There are four essential components to set up in your constructor:
* $this->source - An instance of a class derived from MigrateSource, this
* will feed data to the migration.
* $this->destination - An instance of a class derived from MigrateDestination,
* this will receive data that originated from the source and has been mapped
* by the Migration class, and create Drupal objects.
* $this->map - An instance of a class derived from MigrateMap, this will keep
* track of which source items have been imported and what destination objects
* they map to.
* Mappings - Use $this->addFieldMapping to tell the Migration class what source
* fields correspond to what destination fields, and additional information
* associated with the mappings.
*/
class VersicherungsfaktenTermMigration extends Migration {
public function __construct() {
// Process initialization and include it in the my_migrate group
parent::__construct(); //MigrateGroup::getInstance('migrate_versicherungsfakten')
// Give a description to this process
$this->description = t('Import FINMA data to content type Versicherungsfakten');
// Add custom columns because 8,9,10 and 11 not exists in source cvs
$columns = array(
// 0 => array('Bereich_csv', 'Bereich'),
// 1 => array('Sitzland_csv', 'Sitzland'),
// 2 => array('VersichererName_csv', 'VersichererName'),
// 3 => array('QuelleAkro_csv', 'QuelleAkro'),
// 4 => array('KennzahlAkro_csv', 'KennzahlAkro'),
// 5 => array('KennzahlName_csv', 'KennzahlName'),
// 6 => array('Jahr_csv', 'Jahr'),
// 7 => array('Wert_csv', 'Wert'),
// 8 => array('VersichererGesellschaft_csv', 'VersichererGesellschaft'),
// 9 => array('QuelleSparte_csv', 'QuelleSparte'),
// 10 => array('QuelleBuchung_csv', 'QuelleBuchung'),
// 11 => array('QuelleVersicherung_csv', 'QuelleVersicherung')
array('Id_csv', 'Id'), // Integer
array('Bereich_csv', 'Bereich'),
array('Sitzland_csv', 'Sitzland'),
array('VersichererName_csv', 'VersichererName'),
array('QuelleAkro_csv', 'QuelleAkro'),
array('KennzahlAkro_csv', 'KennzahlAkro'),
array('KennzahlName_csv', 'KennzahlName'),
array('Jahr_csv', 'Jahr'),
array('Wert_csv', 'Wert'), // Integer
array('VersichererGesellschaft_csv', 'VersichererGesellschaft'),
array('QuelleSparte_csv', 'QuelleSparte'),
array('QuelleBuchung_csv', 'QuelleBuchung'),
array('QuelleVersicherung_csv', 'QuelleVersicherung'),
);
$this->source = new MigrateSourceCSV(file_directory_path() . '/finma_import/FINMA_Basisdaten2010.csv',
$columns,
array(
'delimiter' => ';',
'header_rows' => 1
)
);
// Set up our destination content type
$this->destination = new MigrateDestinationNode("versicherungsfakten");
//$this->destination = new MigrateDestinationTerm("versicherungsfakten");
$this->map = new MigrateSQLMap($this->machineName,
array(
'Id_csv' => array( // this field is used to connect user und profile2
'type' => 'int'
)
),
MigrateDestinationNode::getKeySchema()
//MigrateDestinationTerm::getKeySchema()
);
// Assign mappings TO destination fields FROM source fields. To discover
// the names used in these calls, use the drush commands
// drush migrate-fields-destination VersicherungsfaktenTerm
// drush migrate-fields-source VersicherungsfaktenTerm
$this->addFieldMapping('Bereich', 'Bereich');
$this->addFieldMapping('Sitzland', 'Sitzland_csv');
$this->addFieldMapping('Versicherer Name', 'VersichererName_csv');
$this->addFieldMapping('Quelle Akro', 'QuelleAkro_csv');
$this->addFieldMapping('Kennzahl Akro', 'KennzahlAkro_csv');
$this->addFieldMapping('Kennzahl Name', 'KennzahlName_csv');
$this->addFieldMapping('Jahr', 'Jahr_csv');
$this->addFieldMapping('Wert', 'Wert_csv');
$this->addFieldMapping('Versicherer Gesellschaft', 'VersichererGesellschaft_csv');
$this->addFieldMapping('Quelle Sparte', 'QuelleSparte_csv');
$this->addFieldMapping('Quelle Buchung', 'QuelleBuchung_csv');
$this->addFieldMapping('Quelle Versicherung', 'QuelleVersicherung_csv');
}
/**
* The function prepareRow cant be overwrited in order to do some custom
* processing when the source data has been read. The $row object contains
* the field values of the current row being processed.
*
* In our case we use it to process the special mappings for the images,
* gallery and documents fields. To achive this we have defined a custom
* that we call for each field of type image or file.
*/
public function prepareRow($row) {
$this->splitQuelleAkroToQuelleDefinition($row);
//$new = $this->getFieldMappings($row->Bereich_csv); // = 'HaHa blabla';
//print $new;
//$this->node->nid = 432309;
return true;
}
private function splitQuelleAkroToQuelleDefinition($row) {
switch ($row->QuelleAkro_csv) {
case 'AL16F':
$row->QuelleSparte_csv = 'NaNa';
$row->QuelleBuchung_csv = 'Versicherte Summen und Renten';
$row->QuelleVersicherung_csv = 'Lebensversicherung';
$row->VersichererGesellschaft_csv = 'AXA';
break;
case 'AS02B':
$row->QuelleSparte_csv = 'HUHU';
$row->QuelleBuchung_csv = 'Versicherte Summen und Renten';
$row->QuelleVersicherung_csv = 'Lebensversicherung';
$row->VersichererGesellschaft_csv = 'AXA';
break;
default:
$row->QuelleSparte = 'Nein';
$row->QuelleBuchung = 'Nein';
$row->QuelleVersicherung = 'Nein';
$row->VersichererGesellschaft_csv = 'Nein';
}
}
}
?>
Technische Eckdaten:
Drupal 6.x
phpStorm als Entwicklungsumgebung (auf Windows 7)
Code Files auf VMware Linux Ubuntu gespeichert und via Netzlaufwerk unter Windows in phpStorm bearbeitet.
Mein erstelltes Modul ist vom CCK Modul abgeleitet.
Gruss und danke für euer Tipps....
Dolce
- Anmelden oder Registrieren um Kommentare zu schreiben
Zwei Fragen die mir dazu
am 10.05.2013 - 12:58 Uhr
Zwei Fragen die mir dazu direkt einfallen:
Sind die Daten im UTF8-Format?
Warum schreibst Du ein eigenes Modul, statt [do:feeds Feeds] und [do:feeds_tamper Feed_tamper] zu benutzen?
Beste Grüße
Werner
UTF8-Format: wo kann ich das
am 10.05.2013 - 13:25 Uhr
UTF8-Format: wo kann ich das prüfen?
Eigenes Modul: Weil mir das so vorgegeben wurde und es soll auch aktiviert.- und deaktiviert werden können.
Bei meinem Fall stimmt ja das Mapping in die Felder der Taxonomie nicht. Ich hab auch schon versucht über die Values via Vocabular ID den Taxonomien zuzuweisen.
Weiter ist die Frage hier noch offen, weshalb das Mapping bei 2 von 12 Feldern funktioniert...
Dolce schrieb UTF8-Format: wo
am 10.05.2013 - 13:27 Uhr
UTF8-Format: wo kann ich das prüfen?
Wenn du eine CSV-Datei speicherst, dann mußt du doch die Kodierung festlegen, und im besten ist da wohl UTF8 als Kodierung
Eigenes Modul: Weil mir das so vorgegeben wurde und es soll auch aktiviert.- und deaktiviert werden können.
Die Funktionalität von Feeds und Feeds Tamper geht weit über dein Modul hinaus und ist wesentlich flexibler. Da machen auch Taxonomie-Begriffe überhaupt keine Probleme.
Feeds und Feeds-Tamper kann man auch deaktivieren :-)
Ich habe spezielle zum CSV-Import vor kurzem ein auch ein Video veröffentlicht.
Ich bin mir da nicht so sicher, ob du den richtigen Weg beschreitest.
Gruß
Berthold Lausch
Wie bereits erwähnt..
am 10.05.2013 - 13:59 Uhr
bin ein Anfänger in der Drupal Welt und weiss somit noch nicht genau was alles möglich ist. werde jedoch deinen Ansatz prüfen. Was rechnest Du so als implementations aufwand?
Hab noch vergessen zu erwähnen, dass ich anschliessend über diese Daten einen Filter bauen darf um diese in Tabellen oder Grafiken dar zu stellen.
Muss ich anhand deines Videos anstatt Taxonomien Felder anlegen?
Weiter muss beachtet werden, dass ich mit Drupal 6 arbeite und mit Drupal 7 die Verschmelzung der Taxonomie und den Feldern enger verknüpft wurde.
Gruss Dolce
Du mußt auf jeden Fall Felder
am 10.05.2013 - 13:59 Uhr
Du mußt auf jeden Fall Felder im Datensatz haben (eines oder mehrere, ein Feld ist dann einem Vokabular zugeordnet), die die Taxonomiebegriffe aufnehmen (einen oder mehrere, je nach Definition). Mit dem Import werden es Dupal-Nodes. Damit kannst Du alles tun, was so mit Nodes möglich ist, also auch mit Views in diversen Formaten und gefilter ausgeben.
Beste Grüße
Werner
Ok vielen Dank bis jetzt
am 10.05.2013 - 14:14 Uhr
Ich hab nun als erstes einen Inhaltstyp mit 12 Taxonomien.
Wenn ich dich nun richtig verstanden habe, sollte ich einen Inhaltstyp mit einer Taxonomie, welche meine 12 Felder hält, aufbauen.
Gruss Dolce
Halt, das erscheint mir jetzt
am 10.05.2013 - 14:35 Uhr
Halt, das erscheint mir jetzt etwas verwirrend. Du solltest Dir als erstes mal Gedanken über eine vernünftige Datenstruktur machen. Hier unterscheidet sich Drupal deutlich von anderen CMS. Die Stuktur der Daten ist wesentlich für die weitere Arbeit. Wenn die nicht sinnvoll aufgesetzt ist, läufst Du in den Wald.
Beste Grüße
Werner
P.S. Du bekommst eine PM von mir
nur als hinweis: nimm
am 10.05.2013 - 14:42 Uhr
nur als hinweis: nimm drupl7!! drupal6 hört bald auf...
und drupal 8 kommt bald schon
bin leider...
am 10.05.2013 - 14:49 Uhr
Bin leider, da ein Teil des Projektes bereits in Drupal 6 existent ist, an diese Version gebunden. werde deinen Vorschlag jedoch entgegen nehmen und anbringen.
Hab dir einen PM gesendet mit
am 10.05.2013 - 14:50 Uhr
@wla: Hab dir einen PM gesendet mit meinem Skypenamen.
Dolce schrieb Bin leider, da
am 10.05.2013 - 14:57 Uhr
Bin leider, da ein Teil des Projektes bereits in Drupal 6 existent ist, an diese Version gebunden. werde deinen Vorschlag jedoch entgegen nehmen und anbringen.
dann erst upgraden auf d7..