Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια χαρά,

 

έχω κατέβασει κάτι αρχεία σε xml και θέλω να τα μετατρέψω σε πίνακες, όχι όμως σε excel γιατί θα περάσει το όριο των γραμμών.

 

Υπάρχει τρόπος με κάποια γλώσσα προγραμματισμού όπως η Python π.χ. να τα κάνω σε .txt;

 

Θα το εκτιμούσα πολύ αν μπορούσατε να μου δείξετε ένα τρόπο, ούτως ώστε να δημιουργηθεί ένας σωστός πίνακας.

Δημοσ.

Βλέπεις τα πεδία (nodes από το XML) που θέλεις, διαβάζεις το XML και γράφεις σε txt. 

 

 

Υπάρχουν XML parsers σε σχεδόν όλες τις γλώσσες. Ένας που με έχει βολέψει πολύ είναι ο TinyXML

Δημοσ.

Αν θες python και δεν θες dependencies τότε τσέκαρε το ElementTree. Παραδείγματα μπορείς να βρεις εδώ.

 

Αν δεν σε ενοχλούν τα dependencies τότε δες την lxml. To API τους είναι σχεδόν το ίδιο.

Δημοσ.

Παιδιά βοηθάτε λίγο, άνοιξα τα data με notepad και βλέπω αυτό(συν πολλά άλλα που ακολουθούν αλλά δε διαβάζονται εύκολα, αφού είναι συνεχόμενα (εκεί είναι τα δεδομένα)):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-assignments [
<!ELEMENT us-patent-assignments (action-key-code, transaction-date, patent-assignments)>
<!ATTLIST us-patent-assignments  dtd-version   CDATA  #IMPLIED
                                 date-produced CDATA  #IMPLIED>
<!ELEMENT action-key-code (#PCDATA)>
<!ELEMENT transaction-date (date)>
<!ELEMENT patent-assignments (data-available-code | patent-assignment+)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT data-available-code (#PCDATA)>
<!ELEMENT patent-assignment (assignment-record, patent-assignors, patent-assignees, patent-properties)>
<!ELEMENT assignment-record (reel-no, frame-no, last-update-date, purge-indicator, recorded-date, page-count?, correspondent, conveyance-text)>
<!ELEMENT patent-assignors (patent-assignor+)>
<!ELEMENT patent-assignees (patent-assignee+)>
<!ELEMENT patent-properties (patent-property+)>
<!ELEMENT reel-no (#PCDATA)>
<!ELEMENT frame-no (#PCDATA)>
<!ELEMENT last-update-date (date)>
<!ELEMENT purge-indicator (#PCDATA)>
<!ELEMENT recorded-date (date)>
<!ELEMENT page-count (#PCDATA)>
<!ELEMENT correspondent (name, address-1?, address-2?, address-3?, address-4?)>
<!ELEMENT conveyance-text (#PCDATA)>
<!ELEMENT patent-assignor (name, execution-date?, date-acknowledged?)>
<!ELEMENT patent-assignee (name, address-1?, address-2?, city?, state?, country-name?, postcode?)>
<!ELEMENT patent-property (document-id*, invention-title?)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name name-type (natural | legal)  #IMPLIED>
<!ELEMENT address-1 (#PCDATA)>
<!ELEMENT address-2 (#PCDATA)>
<!ELEMENT address-3 (#PCDATA)>
<!ELEMENT address-4 (#PCDATA)>
<!ELEMENT execution-date (date)>
<!ELEMENT date-acknowledged (date)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT country-name (#PCDATA)>
<!ELEMENT postcode (#PCDATA)>
<!ELEMENT document-id (country, doc-number, kind?, name?, date?)>
<!ELEMENT invention-title (#PCDATA | b | i | u | sup | sub)*>
<!ATTLIST invention-title  id   ID     #IMPLIED
                           lang CDATA  #REQUIRED>
<!ELEMENT country (#PCDATA)>
<!ELEMENT doc-number (#PCDATA)>
<!ELEMENT kind (#PCDATA)>
<!--bold formatting for text-->
<!ELEMENT b (#PCDATA | i | u | smallcaps)*>
<!--italic formatting for text-->
<!ELEMENT i (#PCDATA | b | u | smallcaps)*>
<!--underscore: style - single is default-->
<!ELEMENT u (#PCDATA | b | i | smallcaps)*>
<!ATTLIST u  style  (single | double | dash | dots )  'single' >
<!--superscripted text-->
<!ELEMENT sup (#PCDATA | b | u | i)*>
<!--subscripted text-->
<!ELEMENT sub (#PCDATA | b | u | i)*>
<!--small capitals-->
<!ELEMENT smallcaps (#PCDATA | b | u | i)*>
]> 

Πώς μπορώ να κρατήσω, ας πούμε το action_key_code, date και country, αλλά να είναι σαν πίνακας, π.χ.,

 

action_key_code       date      country

1                               1999       GRC

2                               1998       USA

3                               2012       Denmark


Θα δώσω άλλο ένα παράδειγμα. 'Εστω τα δεδομένα είναι τα εξής σε ένα αρχείο με όνομα country_data.xml:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

Ο κάτωθι κωδικός σε Python δίνει μόνο το όνομα της χώρας. 

import xml.etree.ElementTree as ET

tree = ET.parse("country_data.xml")

root = tree.getroot()

for child in root:
    print (child.tag, child.attrib)

Πώς μπορώ να παρώ όλα τα πεδία; Αν τα καταφέρω σε αυτό, πιστεύω μπορώ να κάνω και το μεγάλο project.

Δημοσ.

LINQ to XML

FileStream fs = File.OpenRead("xxx.xml");
XDocument doc = XDocument.Load(fs); 
doc.Element("data").Elements("country")
	.Select(x => new
	{
	   Country = x.Attribute("name").Value,
	   Year = x.Element("year").Value
	   //...
	});
Δημοσ.

 

LINQ to XML

FileStream fs = File.OpenRead("xxx.xml");
XDocument doc = XDocument.Load(fs); 
doc.Element("data").Elements("country")
	.Select(x => new
	{
	   Country = x.Attribute("name").Value,
	   Year = x.Element("year").Value
	   //...
	});

 

Αυτό δεν είναι Python, έτσι;

Δημοσ.

Πώς μπορώ να παρώ όλα τα πεδία; Αν τα καταφέρω σε αυτό, πιστεύω μπορώ να κάνω και το μεγάλο project.

 

Καταρχάς, πρέπει να μάθεις τι είναι αυτά που έχεις. 

 

 

Το πρώτο είναι η περιγραφή του υπόλοιπου και το δεύτερο (το υπόλοιπο) τα πραγματικά δεδομένα. 

 

 

Εν γένει, ένα XML αρχείο μπορείς να το δεις ως δένδρο. Έτσι, με όποιον parser και εάν ασχοληθείς θα διατρέχεις το δένδρο με infix τρόπο (ας πούμε...).

 

 

Από εκεί και πέρα, κάθε parser έχει τα δικά του χούγια. Οπότε, διάλεξε έναν από τους προτεινόμενους ή ψάξε στο google για "XML parser xxxxx", όπου "xxxxx" είναι η γλώσσα που προτιμάς. Π.χ. "XML parser C++". 

 

Διάλεξε έναν που να έχει και παραδείγματα και έτοιμος. 

Δημοσ.

Υπάρχει πρόγραμμα που κάνει τη δουλειά σαν black box, δηλαδή, να του δώσω το αρχείο και να μου πει τι θέλω να βγάλει και σε τι format, γιατί δε με βλέπω καθόλου καλά.

Δημοσ.

Για το κάτωθι παράδειγμα:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

Μπορείς να πάρεις κάποια δεδομένα ---αν και θα ήθελα στην ιδια γραμμή να είναι και η χώρα--- με το εξής σκριπτάκι σε Python:

'''
This is a program in Python to read xml files

'''

import xml.etree.ElementTree as ET
from xml.etree import cElementTree as ET

tree = ET.parse("country_data.xml")

root = tree.getroot()

for country in list(root):
    rank = country.find('rank').text
    year = country.find('year').text
    gdppc = country.find('gdppc').text
    print('rank: %s; year: %s; gdppc: %s' % (rank, year, gdppc))

print ('')

# so it will wait and not close
input("Press ENTER to continue: ")

Καθάρισα κάπως τα δεδομένα(για τη βάση δεδομένων που θέλω να χρησιμοποιήσω εντέλει), ώστε να δω τη δομή (παιδιά είναι όλα μονοκονδυλία, τίποτα δεν φαίνεται καλά) και έχουν ως εξής:

<?xml version="1.0" encoding="UTF-8"?>

<patent-assignment>

    <assignment-record>
        <reel-no>1280</reel-no>
        <frame-no>340</frame-no>
        <last-update-date>
            <date>19990729</date>
        </last-update-date>
        <purge-indicator>N</purge-indicator>
        <recorded-date>
            <date>19941230</date>
        </recorded-date>
        <page-count>2</page-count>

        <correspondent>
            <name>THOMAS J. ENGELLENNER</name>
            <address-1>LAHIVE & amp; COCKFIELD</address-1>
            <address-2>60 STATE STREET</address-2>
            <address-3>SUITE 510</address-3>
            <address-4>BOSTON, MA  02109</address-4>
        </correspondent>

        <conveyance-text>ASSIGNMENT OF ASSIGNORS INTEREST (SEE DOCUMENT FOR DETAILS).</conveyance-text>
    </assignment-record>

    <patent-assignors>
        <patent-assignor>
            <name>ATALA, ANTHONY</name>
            <execution-date>
                <date>19941222</date>
            </execution-date>
        </patent-assignor>
    </patent-assignors>

    <patent-assignees>
        <patent-assignee>
            <name>CHILDREN'S MEDICAL CENTER CORPORATION</name>
            <address-1>55 SHATTUCK STREET  bOSTON, MA  02115</address-1>
        </patent-assignee>
    </patent-assignees>

    <patent-properties>
        <patent-property>
            <document-id>
                <country>US</country>
                <doc-number>08326711</doc-number>
                <kind>X0</kind>
                <date>19941020</date>
            </document-id>
            <document-id>
                <country>US</country>
                <doc-number>5858003</doc-number>
                <kind>B1</kind>
                <date>19990112</date>
            </document-id>
            <invention-title lang="en">SYSTEMS AND METHODS FOR PROMOTING TISSUE GROWTH</invention-title>
        </patent-property>
    </patent-properties>

</patent-assignment>

<!--
This is a comment in xml
Well, I made the structure of one pattent, the others should follow the same drill.
Now, what I want to keep is:

[1] real-no
[2] frame-no
[3] last-update-date
[4] recorded-date
[5] from correspondent: name, address-1, address-2, address-3, address-4
[6] from pattent assignees, the name and address-1

 --> 

Μπορώ να κάνω το ίδιο, ώστε να κρατήσω τα αποτελέσματα που έχω στο comment. Υπόψην πως ουσιαστικά θέλω να γράψω ένα .txt αρχείο με tab delimitation, ώστε να το φορτώσω σε στατιστικό πακέτο.

Δημοσ.

Το excel που κολλάει;

 

Από το 2007 και μετά λογικά δεν έχει θέμα με τον αριθμό των rows.

 

OK αδερφέ, φαίνεται ότι η λύσις σου δουλεύει. Με βοήθησες πολύ σήμερα.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...