Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Vytvoreni xml z textoveho souboru - nejsnadnejsi zpusob?

Ahoj,

chtel jsem pozadat o nakop, v cem by bylo nejsnadnejsi zrealizovat toto:

- mam textove soubory ve formatu:

   G0010    12169.000000000     4397.062500000  -800143.000000000 -1131261.503906000      595.693000000 
   G0008    10870.500000000    11456.468800000  -801458.250000000 -1135380.219000000      550.239000000 
   G0009    10429.000000000    36643.875000000  -803682.500000000 -1150296.000000000      695.614000000 
   ...

- potrebuji tato cisla nasoukat do xml tagu (pro kazdy radek z textaku):

  <Control_Point_Data>
     <Control_Point_ID>G0010</Control_Point_ID>
     <Control_Point_X_Value>-800143.000000000</Control_Point_X_Value>
     <Control_Point_Y_Value>-1131261.503906000</Control_Point_Y_Value>
     <Control_Point_Z_Value>595.693000000 </Control_Point_Z_Value>
  </Control_Point_Data>

No napada mne zneuzit utrzky z http://pc.poradna.net/question/view/125870-cteni-a- zapis-z-do-externiho-souboru-na-www-strance a trochu se potrapit s JavaScriptem, ale chtel jsem se zeptat, zda by nebylo bezbolestnejsi reseni.

Dekuju za rady, M.

Předmět Autor Datum
Ten textový soubor bych naimportoval do Excelu a pak našel na internetu konvertor z XLS na XML... Ko…
host 20.07.2007 21:49
host
Ok, zkusim to cestou Excelu + konvertoru. V textaku jsou tabulatory. Za php nabidku moc diky, zkusim…
Mrak 20.07.2007 21:58
Mrak
V php bych nejspíš použil primitivní čtení souboru pomocí cyklu while a klasické funkce.
host 20.07.2007 22:05
host
Ja by som si na to vybral C++ alebo C#. Ale je to úloha, na ktorú si môžeš zvoliť takmer ktorýkoľvek…
los 20.07.2007 22:14
los
Bylo mi jasný, že jakmile si tenhle thread přečte los, mám po kšeftu. :.(;-)
host 20.07.2007 22:22
host
Clovece lose (lze li to tak rici), ty musis mit nejaky budicek na tyhle dotazy tykajici se programov…
Mrak 20.07.2007 22:28
Mrak
Připojím se s JScriptem fs = new ActiveXObject("Scripting.FileSystemObject"); source = fs.GetFile("…
Mitch 20.07.2007 22:33
Mitch
No take diky :-), tak jeste C++, PHP, C# a budu to mit skoro vsechno... Jeste bych mel jeden dotaz -…
Mrak 20.07.2007 22:44
Mrak
C# a PHP bych dal, s C++ to bude horší:-) Tohle mi přije dobrý v tom, že nepotřebuješ kompilátor ani…
Mitch 20.07.2007 22:53
Mitch
Dekuju za odpoved. Tak jeste dovol jeden dotaz - pokud tam misto tabulatoru jsou mezery (coz jsem na…
Mrak 20.07.2007 23:01
Mrak
Jo, pomocí regulárního výrazu nahradit libovolný počet mezer jedním znakem - třeba jednou mezerou. T…
Mitch 20.07.2007 23:17
Mitch
:beer:. M.
Mrak 20.07.2007 23:19
Mrak
objects = line.replace(/ +/g,";").split(";"); replace(/ +/g,";") každá sekvence minimálně jedné a m…
Mitch 20.07.2007 23:25
Mitch
Super. Dovolil jsem si tam malou upravu v tom regularnim vyrazu (pouzil jsem vyraz losa), protoze r…
Mrak 20.07.2007 23:45
Mrak
Jo oni jsou ještě mezery na začátku. Tak ty jsem při ukládání ke mě do souboru nekompromisně odstran… poslední
Mitch 20.07.2007 23:50
Mitch

Ten textový soubor bych naimportoval do Excelu a pak našel na internetu konvertor z XLS na XML... Koukal jsem Googlem a něco takovýho existuje.

Sloupce v texťáku jsou tvořeny mezerama? Nebo tabulátory?
Kdybys s tím nemohl hnout, napsal bych ti php skriptík na převod.

Technicky čistým řešením by bylo použít transformaci XML pomocí XSLT.

Ok, zkusim to cestou Excelu + konvertoru. V textaku jsou tabulatory.
Za php nabidku moc diky, zkusim to nejdriv sam, a kdybych s rannim kuropenim nebyl hotov, ozvu se. Dovol male vyzvidani - v tom php bys pouzil nejake specialni xml knihovnicky, nebo bys pracoval jen s retezci?

Diky! M.

Ja by som si na to vybral C++ alebo C#. Ale je to úloha, na ktorú si môžeš zvoliť takmer ktorýkoľvek jazyk, napr. JavaScript:

function transform(text) {
  var lines = text.split("\n");
  var results = [];
  
  for (var i = 0; i < lines.length; ++i) {
    var values = lines[i].replace(/^\s+|\s+$/g, "").split(/\s+/);
    
    results.push(
      "<Control_Point_Data>\n" +
      "  <Control_Point_ID>" + values[0] + "</Control_Point_ID>\n" +
      "  <Control_Point_X_Value>" + values[3] + "</Control_Point_X_Value>\n" +
      "  <Control_Point_Y_Value>" + values[4] + "</Control_Point_Y_Value>\n" +
      "  <Control_Point_Z_Value>" + values[5] + "</Control_Point_Z_Value>\n" +
      "</Control_Point_Data>\n");
  }
  
  return results.join("");
}

Clovece lose (lze li to tak rici), ty musis mit nejaky budicek na tyhle dotazy tykajici se programovani. At uz jsou to VB, VBA makra v MS Office ci takoveto vymysly, jako ted ja, asi uz ty kody mas predpripraveny nebo vimjaco. No nechci nikomu lizt do zadku, ale mate muj obdiv (vcetne tacuda, hosta a asi i dalsich, kteri jiz nejednou takhle promptne a "na zakazku" pomohli).
M.

Připojím se s JScriptem

fs = new ActiveXObject("Scripting.FileSystemObject");
source = fs.GetFile("source.txt");
dest = fs.CreateTextFile("dest.xml", true);

filestream = source.OpenAsTextStream(1, 0);

while(!filestream.AtEndOfStream)
{
   line = filestream.ReadLine();
   objects = line.split(String.fromCharCode(9));
   
   dest.writeline("<Control_Point_Data>");
   dest.writeline(" <Control_Point_ID>"+objects[0]+"</Control_Point_ID>");
   dest.writeline(" <Control_Point_X_Value>"+objects[3]+"</Control_Point_X_Value>");
   dest.writeline(" <Control_Point_Y_Value>"+objects[4]+"</Control_Point_Y_Value>");
   dest.writeline(" <Control_Point_Z_Value>"+objects[5]+"</Control_Point_Z_Value>");
   dest.writeline("</Control_Point_Data>");
}
 
filestream.Close();
dest.Close();

Počítá se s tím že ten soubor s daty se jmenuje "source.txt" a data jsou oddělené tabelátorem. <?xml... a další věci už není problém přidat.

C# a PHP bych dal, s C++ to bude horší:-) Tohle mi přije dobrý v tom, že nepotřebuješ kompilátor ani server s PHP.

definujes oddelovnik - "9" je kod pro tabulator, pokud by v souboru byly mezery, dalo by se tam "32"?

Přesně, ale s mezerníkem by bylo přehlednější

objects = line.split(" ");

Ono to tak funguje i s tabelátorem, ale vypadá to jako několik mezer tak jsem radši zvolil zápis kódem.

Super. Dovolil jsem si tam malou upravu v tom regularnim vyrazu (pouzil jsem vyraz losa), protoze

replace(/ +/g,";")

diky mezere na zacatku radku vlozilo i strednik na zacatek a tagy byly vuci textu o jedno posunute.

Takto to funguje k me spokojenosti:

fs = new ActiveXObject("Scripting.FileSystemObject");
source = fs.GetFile("source.txt");
dest = fs.CreateTextFile("dest.xml", true);

filestream = source.OpenAsTextStream(1, 0);

while(!filestream.AtEndOfStream)
{
   line = filestream.ReadLine();
   objects = line.replace(/^\s+|\s+$/g, "").split(/\s+/);
   
   dest.writeline("<Control_Point_Data>");
   dest.writeline(" <Control_Point_ID>"+objects[0]+"</Control_Point_ID>");
   dest.writeline(" <Control_Point_X_Value>"+objects[1]+"</Control_Point_X_Value>");
   dest.writeline(" <Control_Point_Y_Value>"+objects[2]+"</Control_Point_Y_Value>");
   dest.writeline(" <Control_Point_Z_Value>"+objects[3]+"</Control_Point_Z_Value>");
   dest.writeline("</Control_Point_Data>");
}
 
filestream.Close();
dest.Close();

Jeste jednou vsem velice dekuji :beer: + :beer: + :beer:.
M.

Zpět do poradny Odpovědět na původní otázku Nahoru