[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 WHY 于 2020-6-27 13:41 编辑

Test.js
  1. var srcDir = 'E:/Test/X42';  //存放xml的文件夹
  2. var dstFile = 'result.csv';  //输出csv文件名
  3. var out = [];  
  4. var xml = new ActiveXObject('Microsoft.XMLDOM');
  5. var fso = new ActiveXObject('Scripting.FileSystemObject');
  6. var getXMLData = function(fp) {
  7.     xml.load(fp);
  8.     var reg = /<value>([^<>]*)</g;
  9.     var arr = xml.selectNodes('//char'), Len = arr.length;
  10.     for(var i=0; i<Len; i++){
  11.         var s = arr[i].xml;
  12.         var a = ['0', ['0', '0'], '0', '0'];
  13.         var m = s.match(/<charName>([^<>]*)</);
  14.         if(m) a[0] = '"' + m[1] + '"';
  15.    
  16.         var j = 0;
  17.         while( m = reg.exec(s) ) a[1][j++] = '"' + m[1] + '"';
  18.    
  19.         var m = s.match(/[_"]unicode">([^<>]*)</);
  20.         if(m) a[2] = '"' + m[1] + '"';
  21.    
  22.         var m = s.match(/"PUA">([^<>]*)</);
  23.         if(m) a[3] = '"' + m[1] + '"';
  24.         
  25.         out.push( a.join(',') );
  26.     }
  27. }
  28. var writeToCsv = function(dstFile) {
  29.     var ado = new ActiveXObject('ADODB.Stream');
  30.     ado.Mode = 3;
  31.     ado.Type = 2;
  32.     ado.Charset = 'utf-8';
  33.     ado.Open();
  34.     ado.WriteText(out.join('\r\n'));
  35.     ado.SaveToFile(dstFile, 2);
  36. }
  37. var getXmlFile = function(fd){
  38.     var e1 = new Enumerator(fso.getFolder(fd).Files);
  39.     var e2 = new Enumerator(fso.getFolder(fd).SubFolders);
  40.     for(; !e1.atEnd(); e1.moveNext()){
  41.         var fp = e1.item().Path;
  42.         if( !/\.xml$/i.test(fp) ) continue;
  43.         getXMLData(fp);
  44.     }
  45.     for(; !e2.atEnd(); e2.moveNext())getXmlFile(e2.item().Path) ; //递归遍历子目录
  46. }
  47. getXmlFile(srcDir);
  48. writeToCsv(dstFile);
  49. WSH.Echo('Done');
复制代码
out.push(a) 效率非常低,改为 out.push(a.join(','))
贴一个不用正则的办法:
  1. $srcDir = 'E:\Test\X42';
  2. $dstFile = 'Result.CSV';
  3. $fsw = New-Object System.IO.StreamWriter($dstFile, $false, [Text.Encoding]::UTF8);
  4. $files = dir -Literal $srcDir -Filter '*.xml' -Recurse -File;
  5. $count = $files.Count;
  6. for($i=0; $i -lt $count; $i++) {
  7.     [xml]$xml = [IO.File]::ReadAllLines($files[$i].FullName, [Text.Encoding]::UTF8);
  8.     $node = $xml.GetElementsByTagName('char');
  9.     $Len  = $node.Count;
  10.     for($j=0; $j -lt $Len; $j++){
  11.         $arr      = @('0', '0', '0', '0', '0');
  12.         $charName = $node[$j].charName;
  13.         $value    = @( $node[$j].charProp.Value );
  14.         $type     = @( $node[$j].mapping.type );
  15.         $text     = @( $node[$j].mapping.innerText );
  16.         if( $charName -ne $null ) { $arr[0] = '"' + $charName + '"'; }
  17.         for($k=0; $k -lt 2; $k++) {
  18.             if( $value[$k] -ne $null ) { $arr[1+$k] = '"' + $value[$k] + '"'; }
  19.             if( $type[$k] -ne $null ) {
  20.                 if( $type[$k].EndsWith('unicode') ){ $arr[3] = '"' + $text[$k] + '"'; }
  21.                 if( $type[$k] -eq 'PUA' ) { $arr[4] = '"' + $text[$k] + '"'; }
  22.             }
  23.         }
  24.         $fsw.WriteLine( $arr -join  ',' );
  25.     }
  26.     if($i % 1000 -eq 0 ) { $fsw.Flush(); }
  27. }
  28. $fsw.Flush();
  29. $fsw.Close();
  30. pause
复制代码
1

评分人数

TOP

返回列表