php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.07.2007, 07:47  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard CSV aus Access, modifikation mit PHP, rein in Excel

Hey Leute

Ich hab ein kleines Problem.

In einer Accessdatenbank gibt es eine Tabelle mit Artikeldaten. Diese Tabelle beinhaltet unter anderem ein Feld mit der Artikelbeschreibung. Dummerweise gibt es für zwei Sprachen nur ein Feld. Das heisst, dass die Beschreibung folgendermassen aufgebaut ist:

Code:
Text Absatz 1 in Deutsch

Text Absatz 2 in Deutsch


Text Absatz 1 in Französisch

Text Absatz 2 in Französisch
Nun gibt es weitere vier Felder in denen angegeben ist, von wo bis wo der Deutsche Text und von wo bis wo der Französische Text geht (in Zeilen). Beispielsweise wäre hier BeginDescGer --> 1, EndDescGer --> 3, BeginDescFra --> 5, EndDescFra --> 7

Meine Aufgabe ist es nun, dass ich die beiden Texte auseinander nehme und in einem Excel-Sheet in verschiedene Zellen schreibe. Dafür exportiere ich die Tabelle in ein XML-File, aus welchem ich dann den Beschreibungstext auslese, mit den Angaben in den Begin und End-Spalten modifiziere und schlussendlich in einem CSV-File ablege.

Das funktioniert soweit auch ganz gut. Nur will mein Chef auch die Zeilenumbrüche innerhalb des Beschreibungstextes behalten. Eine neue Zeile bedeutet für Excel im CSV jedoch nicht eine neue Zeile innerhalb der aktiven Zelle sondern eine ganz neue Zeile. Die Beschreibung für Deutsch soll aber sämtlichst (auch mit Zeilenumbrüchen) in eine Zelle.

Hat einer von euch eine Idee, wie ich in einem CSV-File die Zeilenumbrüche darstellen muss, dass sie einem Alt+Enter im Excel entsprechen?

Teste jetzt schon einige Stunden daran rum. Bin für jede Hilfe dankbar.

Gruss Igäl
Igäl ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.07.2007, 11:30  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Igäl,

ich würde die Zeilenumbrüche einfach codieren. Dazu kann man Beispielsweise "nur" ein \n ohne \r oder jedes beliebige andere nicht darstellbare Steuerzeichen verwenden. Bei Excel erzeugt man intern einen Zeilenumbruch in einer Zelle mit ALT + ENTER. Du kannst dir ja aml ansehen, was das an Steuerzeichen erzeugt und diese dann so maskieren.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 16.07.2007, 13:05  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Ich kriegs net hin... Ich mach jetzt einfach ein CSV das ich so einles dass dann da \n steht und mach dann ein Seek&Destroy bzw. ein Suchen & Ersetzen über das ganze Dokument. Danke aber dennoch wenn ihr euch damit beschäftigt habt
Igäl ist offline  
Alt 16.07.2007, 13:39  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Der XML-Export von MS-Access generiert die Zeilenumbrüch Windows-like als \r\n chr(13)/(chr(10)). MS-Excel interpretiert aber nur ein alleinstehendes \n als zelleninternen Umbruch. Deshalb musst du wohl die überflüssigen \r aus dem XML-File eliminieren. Da aber natürlich auch die Zeilenumbrüche innerhalb des XML-Files mit \r\n codiert, so das du auch noch die Struktur analysieren musst und die Ersetzungen nur innerhalb der entsprechenden Attrubuten durchführst.

Ausserdem stellt sich natürlich die Frage, was das mit PHP zu tun hat.
__________________
Gruss
L
lazydog ist offline  
Alt 16.07.2007, 13:40  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Excel setzt mittels ALT+ENTER einfach einen normalen Zeilenumbruch. Da die einzelnen Zellen mit " umschlossen sind, wird der Zeilenumbruch auch als Inhalt und nicht als neuer Datensatz verstanden.

PHP kann damit ebenso umgehen, wenn die Funktion fgetcsv($fp, 4096, ';', '"') zB so eingesetzt wird. Dürfte also eigentlich alles in allem kein Problem sein:
Code:
"eins
zwei";drei;vier
zehn;"elf
zwölf";dreizehn
(zwei-zeilig)
Zergling-new ist offline  
Alt 16.07.2007, 14:08  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Dann mache ich wohl etwas falsch beim Import. Hab die Schreibweise von deinem Beispiel auch schon gesehen und angeraten bekommen. Hab das jetzt testweise mal so ins CSV geschrieben. Ich importiere über "Daten-->Externe Daten Importieren-->Daten Importieren". Dann wähle ich als Ursprünglicher Datentyp "Getrennt", Dateiursprung "Windows (ANSI)", als Trennzeichen "Semikolon" und als Texterkennungszeichen ".

Importierts mir dann so:

Code:
___|__A__|____B____|__C__|
 1 |eins |         |     |
 2 |zwei"| drei    |vier |
 3 |zehn | elf     |     |
 4 |zwölf|dreizehn |     |
So langsam verlier ich den überblick. Ich beginne wohl besser noch einmal von vorne

Ist sowieso sehr umständlich: Ms Access --> XML --> PHP --> CSV --> Excel... nur weil die Leutchens die das weiterverarbeiten sollen nicht mit XML arbeiten können sondern ne Excel Tabelle brauchen -.-
Igäl ist offline  
Alt 16.07.2007, 14:12  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ich öffne das CSV über Datei -> Öffnen -> Alle Dateien (*) und bekomme es korrekt importiert.
Zergling-new ist offline  
Alt 16.07.2007, 14:17  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Ach ich lass das mit dem CSV... Ich könnte vermutlich viel einfacher das XML modifizieren. Weil das XML mehr oder weniger korrekt importiert wird.
__________________
Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
Mark Twain
Igäl ist offline  
Alt 16.07.2007, 18:56  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Igäl,

jetzt sei doch mal ein bisschen Sportsmann. Wir (Zergling und ich) haben dir schon zwei mal die Lösung beschrieben und jetzt musst du das nur noch implementieren. Einfach aufgeben ist doch langweilig...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 17.07.2007, 10:08  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Hm.. das über CSV hat bei mir einfach nicht funktioniert. Ich weiss auch nicht warum. Danke euch zweien aber vielmals für die Unterstützung. Ich habs jetzt folgendermassen gelöst. Ich lese das ursprüngliche XML-File ein, extrahiere die Bezeichnungsspalte raus, trenne mit PHP die Sprachen und generiere ein neues XML mit zwei Spalten, je eine für jede Sprache:

PHP-Code:
<?php
error_reporting
(E_ALL);
/********************************************************/
class Artikel    {
    protected 
$parser;
    protected 
$elemArr = array();
    private 
$dom_obj;
    private 
$n_xml_data = array();
    private 
$cnt 0;

    public function 
__construct()    {
        
$this->dom_obj $this->generate_dom_doc();        //Ein neues DOM - Objekt
        
$this->parser xml_parser_create();

        
xml_set_object($this->parser$this);
        
xml_set_element_handler($this->parser'startElement''endElement');
        
xml_set_character_data_handler($this->parser'characterData');
    }

    public function 
__destruct()    {
        
$this->insert_data();
        
$this->show_file();                                //Generiertes File anzeigen
        
xml_parser_free($this->parser);
    }

    public function 
readCatalog($catalog)    {
        
xml_parse($this->parserfile_get_contents($catalog), true);
    }

    protected function 
startElement($parser$element$attributes)    {
        
array_push($this->elemArr$element);
    }

    protected function 
endElement($parser$element)    {
        
array_pop($this->elemArr);
    }

    protected function 
characterData($parser$cdata)    {
        switch(
$this->elemArr[sizeof($this->elemArr)-1])    {
            case 
"MEMO":        $this->fill_arr("Memo"$cdata);
                                break;
            case 
"MABBEGD":        $this->fill_arr("MABBegD"$cdata);
                                break;
            case 
"MABENDD":        $this->fill_arr("MABEndD"$cdata);
                                break;
            case 
"MABBEGF":        $this->fill_arr("MABegF"$cdata);
                                break;
            case 
"MABENDF":        $this->fill_arr("MAEndF"$cdata);
                                
$this->cnt++;
                                break;
        }
    }

    private function 
fill_arr($field$cdata)    {
        if(!empty(
$this->n_xml_data[$this->cnt][$field]))    {
            
$this->n_xml_data[$this->cnt][$field] .= $cdata;
        }else{
            
$this->n_xml_data[$this->cnt][$field] = $cdata;
        }
    }

    private function 
generate_dom_doc()    {
        
$dom = new DOMDocument("1.0");
        
header("Content-Type: text/plain");

        return 
$dom;
    }

    private function 
insert_data()    {
        
$art_root $this->dom_obj->createElement("ArtikelRoot");
        
$this->dom_obj->appendChild($art_root);

        for(
$i=0;$i<count($this->n_xml_data);$i++)    {
            
$d_text "";
            
$f_text "";
            
$memo_arr explode("\n"$this->n_xml_data[$i]['Memo']);
            
            
$artikel $this->dom_obj->createElement("Artikel");
            
$art_root->appendChild($artikel);

            
//Deutsche Memo in die Struktur einfügen
            
$memo_d $this->dom_obj->CreateElement("MemoD");
            
$artikel->appendChild($memo_d);
            
            for(
$d=$this->n_xml_data[$i]['MABBegD'];$d<=$this->n_xml_data[$i]['MABEndD'];$d++)    {
                
$d_text .= !empty($memo_arr[$d]) ? $memo_arr[$d] : "\n";
            }

            
$text_d $this->dom_obj->createTextNode($d_text);
            
$memo_d->appendChild($text_d);
            
            
//Französische Memo in die Struktur einfügen
            
$memo_f $this->dom_obj->createElement("MemoF");
            
$artikel->appendChild($memo_f);

            for(
$f=$this->n_xml_data[$i]['MABegF'];$f<=$this->n_xml_data[$i]['MAEndF'];$f++)    {
                
$f_text .= !empty($memo_arr[$f]) ? $memo_arr[$f] : "\n";
            }

            
$text_f $this->dom_obj->createTextNode($f_text);
            
$memo_f->appendChild($text_f);
        }
    }

    private function 
show_file()    {
        echo 
$this->dom_obj->saveXML();
    }
}
/********************************************************/
/********************************************************/
$artikel = new Artikel;

$artikel->readCatalog("Artikel.xml");
/********************************************************/
/********************************************************/
?>
Funktioniert soweit ganz gut... auf jeden fall mal mit zwei Artikeln im XML
Igäl ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
excel -&amp;gt; mysql Datenbanken 3 27.05.2009 20:06
Excel XML solitaer PHP Tipps 2006 9 30.04.2006 15:51
Access Frage - Datenbankverbindung abfragen reimondo Off-Topic Diskussionen 1 01.10.2005 18:24
Excel Sheet innerhalb einer HTML Seite anzeigen PHP Tipps 2005-2 4 20.09.2005 13:32
smarty, php -> Excel PHP Tipps 2005-2 1 13.09.2005 20:42
Problem mit MyODBC und Access fxp Datenbanken 0 04.07.2005 11:55
Mit PHP Excel Makro ausführen PHP Tipps 2005 2 17.04.2005 02:06
Daten von MySQL nach Access schaufeln Datenbanken 8 24.03.2005 09:58
aus Excel mach PHP ?!?! PHP Tipps 2004-2 2 21.12.2004 10:48
You can't access this file directly... <--lol? PHP Tipps 2004-2 2 13.12.2004 18:15
MS Access &amp;amp; ODBC : Gibts DATE_FORMAT Funktion? Datenbanken 2 02.12.2004 14:36
htm und excel Orolhawion Off-Topic Diskussionen 0 03.11.2004 14:52
[Erledigt] MySQL: access denied for user Datenbanken 14 22.08.2004 13:47
MySQL => Excel mit PHP PHP Tipps 2004 4 31.07.2004 12:57
Mysql und Microsoft Access verbinden Datenbanken 4 20.07.2004 18:14

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
excel csv absatz php, zeilenumbruch bei csv beibehalten, php alt enter, steuerzeichen excel zeile, zelleninternen zeilenumbruch generieren, access in csv exportieren neue zeile, php fgetcsv ansi, access memofeld zeilenumbruch, csv in access, access nach excel exportieren zeilenumbrüche, csv aus access, access memo zeilenumbruch csv, csv \alt enter\, excel zeilenumbrüche ersetzen damit access, import csv mit steuerzeichen excel steuerzeichen verketten, php csv export alt enter, csv excel zeilenumbruch behalten, excel xml export zeilenumbruch, access import csv aus php zeilenumbruch, csv zeilenumbruch access import

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.