0

私はこのjavaスクリプトとxslを初めて使用します。.jsコードでxslを使用して.csvファイルをxmlに変換する.jsを使用しています。

多くのパフォーマンスの問題が発生しており、一部の.csvファイルのxmlファイルは作成されません。どんな助けでも本当にありがたいです。

showAbsolutePath("InvoiceAdjustment.js");

function showAbsolutePath(path)
 {
 var fso = new ActiveXObject("Scripting.FileSystemObject");
 var s = "";
 s += fso.GetAbsolutePathName(path);

 var foldername = s.substring(0,s.indexOf(path,0));
 showFolderFileList(foldername);
 }

 function showFolderFileList(foldername)
 {
  var fso, f, fc, filename;

 fso = new ActiveXObject("Scripting.FileSystemObject");
  f = fso.GetFolder(foldername);
 fc = new Enumerator(f.files);

 for (; !fc.atEnd(); fc.moveNext())
 {
  filename = "";
  filename += fc.item();

  if (filename.slice(-4) == ".csv")
  {
    convertCSVtoXML(foldername, filename);
    }
   }  

  fso = null;
  }

function  convertCSVtoXML(foldername, filename)
{ 
var objDOMDocument = new ActiveXObject("MSXML2.DOMDocument.4.0"); 
objDOMDocument.async = false; 

 //Create Header
 objDOMDocument.appendChild(XMLHeader(objDOMDocument)); 
 var objXMLDOMNode = objDOMDocument.documentElement.selectSingleNode("//Document"); 

 // Declare XML object -- this makes it easier to pass as a parameter 
 var objXML  = new Object(); 

 // Open the extracted csv from zip file
 var fso = new ActiveXObject("Scripting.FileSystemObject");

 var csvFilename = filename;

 var tso = fso.OpenTextFile(csvFilename, 1); 
 var strInput; 

 // Loop through the file 
 while(!tso.AtEndOfStream)  
 { 
 strInput = tso.ReadLine();

var vInputLine = strInput.split(","); 
objXML.a = vInputLine[0];
objXML.b = vInputLine[1];
objXML.c = vInputLine[2];
objXML.d = vInputLine[3];
objXML.e = vInputLine[4];



if (objXML.a != 'RebateInvoiceID')
{
  objXMLDOMNode.appendChild(XMLFileNode(objDOMDocument,objXML));
  }    
 } 
 tso.Close();

 // Load Transform file
  var TransformXSL = new ActiveXObject("MSXML2.DOMDocument.4.0");
 TransformXSL.async = false  
 TransformXSL.load(foldername + "\\InvAdj.xsl");

 // Load XML file and transform it
 var TempStagingDoc = new ActiveXObject("MSXML2.DOMDocument.4.0");
 TempStagingDoc.async = false; 
 TempStagingDoc.loadXML(objDOMDocument.xml);      
 var FinalStr = TempStagingDoc.transformNode(TransformXSL);

 // Grab just the file name minus any extension
 var fn = filename.substring(0, filename.indexOf(".csv")); 
 tmpxml = fn + ".xml";  

 // Write out the transformed file. If writing out just the xml file before transform  
 //  FSObject.WriteLine(objDOMDocument.xml);     

  var FSObject = fso.CreateTextFile(tmpxml, true);
  FSObject.WriteLine(FinalStr);
  FSObject.Close();

 /*
 // Create empty .flag file then rename it
  tmpxml += ".flag";
  var fsoEmptyFile = fso.CreateTextFile(tmpxml, true);
   fsoEmptyFile.Close();

  // Rename the .flag file to .done
 var donefilename = tmpxml.substring(0,tmpxml.indexOf(".flag",0));
 donefilename += ".done";
 fso.MoveFile(tmpxml, donefilename);

 // Delete the corresponding .csv file
  fso.DeleteFile(csvFilename);

  */


 // Clear all objects
 objDOMDocument = null; 
 fso = null;
 TransformXSL = null;
 objXML = null;
 TempStagingDoc = null;
  }

 function XMLHeader(objDOMDocument)
 { 
  var XMLHead;
  XMLHead = objDOMDocument.createNode(1, "Document",""); 

  var objXMLDOMAttribute = objDOMDocument.createAttribute("Version"); 
  objXMLDOMAttribute.text = "1.0";
   XMLHead.attributes.setNamedItem(objXMLDOMAttribute);

    var objXMLDOMAttribute = objDOMDocument.createAttribute("CreationTimestamp"); 
   objXMLDOMAttribute.text = getTimestamp();
   XMLHead.attributes.setNamedItem(objXMLDOMAttribute);

   return(XMLHead);
    } 

 function XMLFileNode(objDOMDocument,objXML)
 {     
 var objXMLDOMNode = objDOMDocument.createNode(1, "RawXMLRow","");

 objXMLDOMElement = objDOMDocument.createElement("RebateInvoiceID"); 
 objXMLDOMElement.text = objXML.a;
 objXMLDOMNode.appendChild(objXMLDOMElement);

  objXMLDOMElement = objDOMDocument.createElement("RebateEventID"); 
  objXMLDOMElement.text = objXML.b;
  objXMLDOMNode.appendChild(objXMLDOMElement);

   objXMLDOMElement = objDOMDocument.createElement("BusinessUnitCode");
   function getBusinessUnitCode(){
     var r = String(objXML.c).length;
    if(r == 4)
    return String(objXML.c);
    if( r == 3)
  return "0"+String(objXML.c);
  if(r == 2){
          return "00"+String(objXML.c);
    }
     else
          return "000"+String(objXML.c);

     }
    objXMLDOMElement.text = getBusinessUnitCode();
    objXMLDOMNode.appendChild(objXMLDOMElement);

    objXMLDOMElement = objDOMDocument.createElement("CategoryID"); 
   objXMLDOMElement.text = objXML.d;
   objXMLDOMNode.appendChild(objXMLDOMElement);

    objXMLDOMElement = objDOMDocument.createElement("PaymentAmount"); 
   objXMLDOMElement.text = objXML.e;
    objXMLDOMNode.appendChild(objXMLDOMElement);

    return(objXMLDOMNode);
    }

  function getTimestamp()
   {
  var d = new Date();
   var mm = padZeros(d.getMonth()+1);
   var dd = padZeros(d.getDate());
   var hh = padZeros(d.getHours());
   var mn = padZeros(d.getMinutes());
   var ss = padZeros(d.getSeconds());

   return d.getFullYear()+"-"+ mm +"-"+ dd +"T"+ hh +":"+ mm +":"+ ss;
    }

   function padZeros(s)
     {
        if (s < 10)
        {
        s = "0" + s;
           }
       return(s);
          }

         function getDate(stringDate)
        {
        var a = String(stringDate).split( "/" );
        var strXML ;

          strDate = "" ;

       for ( var i = 0 ; i < a.length; i++ )
       {
         if (a[i].length == 1)
     strDate += "0" + a[i];
        else
     strDate += a[i];
           }

         strDate += "" ;

        return strDate;
        }


    /* code for xsl */
       <?xml version="1.0"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"  
                        xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:script="script" exclude-result-           prefixes="msxsl">
         <xsl:output omit-xml-declaration="yes"/>

        <!-- ROOT -->
        <xsl:template match="/">
      <EnterpriseDocument>
      <xsl:attribute name="InterfaceName">RebateInvoiceAdjustmentImport</xsl:attribute>
       <xsl:attribute name="ClientID">
        <xsl:choose>
       <xsl:when test="normalize-space(ClientID)">
        <xsl:value-of select="//Document/RawXMLRow/ClientID"/>
       </xsl:when>
      <xsl:otherwise>1000001</xsl:otherwise>
       </xsl:choose>
        </xsl:attribute>
        <xsl:attribute name="ClientName">XXXX</xsl:attribute>
          <xsl:attribute name="Version">1.0</xsl:attribute>
        <xsl:attribute name="CreationSource">File</xsl:attribute>
          <xsl:attribute name="CreationTimestamp">
           <xsl:value-of select="script:getTimestamp()"/>
         </xsl:attribute>
           <xsl:call-template name="InvAdjData"/>
         </EnterpriseDocument>
         </xsl:template>

         <xsl:template name="InvAdjData">
            <xsl:for-each select="//Document/RawXMLRow[not(RebateInvoiceID=preceding- 
             sibling::RawXMLRow/RebateInvoiceID)]">
          <xsl:sort select="RebateInvoiceID"/>
           <RebateInvoice>
           <xsl:attribute name="RebateInvoiceID">
           <xsl:value-of select="RebateInvoiceID"/>
              </xsl:attribute>
                <xsl:variable name="InvoiceID">
         <xsl:value-of select="RebateInvoiceID"/>
             </xsl:variable>
           <xsl:for-each select="//Document/RawXMLRow[not(RebateEventID=preceding-
         sibling::RawXMLRow[RebateInvoiceID=$InvoiceID]/RebateEventID)]">
         <xsl:if test="RebateInvoiceID=$InvoiceID">
           <xsl:variable name="EventID">
            <xsl:value-of select="RebateEventID"/>
          </xsl:variable>
          <RebateProgram>
            <xsl:attribute name="RebateEventID">
              <xsl:value-of select="RebateEventID"/>
            </xsl:attribute>

           <xsl:for-each select="//Document/RawXMLRow[not(BusinessUnitCode=preceding- 
          sibling::RawXMLRow[RebateInvoiceID=$InvoiceID and  
             RebateEventID=$EventID]/BusinessUnitCode)]">
              <xsl:if test="RebateInvoiceID=$InvoiceID and RebateEventID=$EventID">
                <xsl:variable name="BUCode">
                  <xsl:value-of select="BusinessUnitCode" />
                </xsl:variable>
                <BusinessUnit>
                  <xsl:attribute name="BusinessUnitCode">
                  <xsl:value-of select="BusinessUnitCode"/>
                </xsl:attribute>

                  <xsl:for-each select="//Document/RawXMLRow[not(CategoryID=preceding-
            sibling::RawXMLRow[RebateInvoiceID=$InvoiceID and RebateEventID=$EventID 
             and BusinessUnitCode=$BUCode]/CategoryID)]">
                    <xsl:if test="RebateInvoiceID=$InvoiceID and RebateEventID=$EventID
                     and BusinessUnitCode=$BUCode">
                      <ItemCategoryPayment>

                        <xsl:attribute name="CategoryID">
                          <xsl:value-of select="CategoryID"/>
                        </xsl:attribute>
                        <xsl:attribute name="PaymentAmount">
                          <xsl:value-of select="PaymentAmount"/>
                        </xsl:attribute>
                      </ItemCategoryPayment>
                    </xsl:if>
                        </xsl:for-each>
                       </BusinessUnit >
                          </xsl:if>

                     </xsl:for-each>

                    </RebateProgram >
                   </xsl:if>
                  </xsl:for-each>
                </RebateInvoice >
              </xsl:for-each>

              </xsl:template>

                <!-- BEGIN JSCRIPT HELPER CODE, KEEP THIS SECTION AS SMALL AS POSSIBLE  
               IT'S A PERFORMANCE HOG -->
      <msxsl:script language="JScript" implements-prefix="script">
        <![CDATA[

            function getTimestamp()
               {
            var d = new Date();
           var m, dy, hr, mn, se;

         if (d.getMonth()+1 < 10)
       {
       m = "0"+(d.getMonth()+1);
        }
      else if (d.getMonth()+1 > 9)
       {
         m = d.getMonth()+1;
        }

      if (d.getDate() < 10)
         {
       dy = "0"+(d.getDate());
         }
        else if (d.getDate() > 9)
            {
         dy = d.getDate();
         }

       if (d.getHours() < 10)
       {
           hr = "0"+(d.getHours());
          }
          else if (d.getHours() > 9)
          {
             hr = d.getHours();
           }

     if (d.getMinutes() < 10)
       {
       mn = "0"+(d.getMinutes());
         }
        else if (d.getMinutes() > 9)
         {
         mn = d.getMinutes();
          }

         if (d.getSeconds() < 10)
         {
           se = "0"+(d.getSeconds());
          }
      else if (d.getSeconds() > 9)
       {
         se = d.getSeconds();
          }

          return d.getFullYear()+"-"+ m +"-"+ dy +"T"+ hr +":"+ mn +":"+ se;
           }

                ]]>
           </msxsl:script>
         </xsl:stylesheet>

.csvファイルを添付する方法がわかりません。しかし、このコードは私がそれをより良くすることができる方法がありますか?あなたのアイデアを共有してください。

/*サンプル.csvファイルデータ*/RebateInvoiceID RebateEventID BusinessUnitCode CategoryID PaymentAmount 1001655 1002652 406 1000043 696.81 1001655 1002650 423 1000043 8.85 1001655 1002652 423 1000043 443.39 1001655 1002650 433 1000043 15.93 3001655 8002652 433 1000043 432.29 3001655 8002653 435 1000043 10.03 5001655 2002652 435 1000043 329.31 5001655 2002652 436 1000043 21.83 5001655 2002655 436 1000043 501.71 5001655 2002655 437 1000043 32.45 5001655 2002655 437 1000043 674.81

4

1 に答える 1

0

このコード:

<xsl:for-each select="//Document/RawXMLRow[not(RebateInvoiceID=preceding- 
             sibling::RawXMLRow/RebateInvoiceID)]">

これは繰り返し表示され、グループ化 (または重複の排除) を行う非常に非効率的な方法です。パフォーマンスは、データ内の行数で 2 次です。XSLT 1.0 に行き詰まっていると仮定して、キーを使用した Muenchian グループ化を調べてください。

于 2012-05-03T07:29:08.883 に答える