我正在处理一组DAT文件,每个文件的大小约为250,000 KB。 里面有许多XML消息,每个消息都很小并且在一行上。
这些是飞机移动信息。我正在寻找EstimatedTimetoDepart更改。
我需要搜索具有某个节点的XML消息,提取此值以及帮助我关联消息的某些先前节点的值。
因此,我提取节点“EstimatedDepartureDateTime”的值以及运营商代码,出发机场的先前节点......等等。
我得到的代码有效。它打开文件,读取一行,将此行转换为XML对象。在此XML中搜索节点。如果找到则提取其他数据并写入数组以写入CSV文件。
问题是它很慢。也许10分钟。我不知道我能做些什么来加快速度。 它不需要是JavaScript。它正是我可以轻松地在工作机器上敲出来的,我还不知道其他脚本语言。
要求提高速度的建议。对不起,如果这篇文章不符合惯例。
function StringtoXML(text)
{
if (window.ActiveXObject) // testing for older IE
{
var doc=new ActiveXObject('Microsoft.XMLDOM');
doc.async='false';
doc.loadXML(text);
}
else // all other browsers
{
var parser=new DOMParser();
var doc=parser.parseFromString(text,'text/xml');
}
return doc;
}
function addToCSVFile(csvFile, outputLocation)
{
var fso = new ActiveXObject('Scripting.FileSystemObject');
var oStream = fso.OpenTextFile(outputLocation, 8, true, 0);
oStream.WriteLine(csvFile.join(','));
oStream.Close();
}
function readXML(singleXmlDoc, nodeSearchString)
{
CsvData = new Array();
var i = 0;
try
{
//alert("getElementsByTagName" + singleXmlDoc.getElementsByTagName("EstimatedDepartureDateTime")[0].text);
//var aReturn = singleXmlDoc.getElementsByTagName("EstimatedDepartureDateTime")[0].text
var aReturn = singleXmlDoc.getElementsByTagName(nodeSearchString)[0].text;
if (aReturn != null )
{
//Carrier code
CsvData[i] = singleXmlDoc.documentElement.childNodes[1].firstChild.text;
i++;
//Flight Number
CsvData[i] = singleXmlDoc.documentElement.childNodes[1].childNodes(1).text;
i++;
//OperationalSuffix
CsvData[i] = singleXmlDoc.documentElement.childNodes[1].childNodes(2).text;
i++;
//DepartureAirportCode
CsvData[i] = singleXmlDoc.documentElement.childNodes[1].childNodes(3).text;
i++;
//FlightOriginDate
CsvData[i] = singleXmlDoc.documentElement.childNodes[1].childNodes(4).text;
i++;
//ArrivalAirportCode
CsvData[i] = singleXmlDoc.documentElement.childNodes[2].childNodes(0).text;
i++;
CsvData[i] = aReturn;
i = 0;
//array holds 6 elements per XML match
}
return CsvData;
}
catch(e)
{
//this catch will fill for every non match
}
//end of Try
}
function extractFileLine()
{
try
{
var cosiLocation = document.getElementById('cosiLocation').value;
var outputLocation = document.getElementById('outputLocation').value;
var searchNodeText = document.getElementById('searchNodeText').value;
var locationArray = [];
if (cosiLocation.indexOf(',') != -1)
{
locationArray = cosiLocation.split(',');
}
else
{
locationArray[0] = cosiLocation;
}
//loop here to open a new file.
for (var i=0; i < locationArray.length; i++)
{
var ForReading = 1;
var fso = new ActiveXObject("Scripting.FileSystemObject");
var fileObj = fso.GetFile(locationArray[i]);
var ts = fileObj.OpenAsTextStream(ForReading, 0 );
var loc = outputLocation + searchNodeText + ".csv";
while(!ts.AtEndOfStream)
{
var textLine = ts.ReadLine();
var xmlDoc = StringtoXML(textLine);
var csvArray = readXML(xmlDoc, searchNodeText);
if (csvArray)
{
addToCSVFile(csvArray, loc);
//alert("Line inserted");
}
}
ts.Close();
//clearData();
}
alert("Done");
}
catch(e)
{
alert('An error has occurred '+e.message);
}
}