2015-04-04 56 views
0

我正在尝试阅读我的空气项目中的文本文件。它实际上是TinkerProxy使用的配置文件。我见到目前为止如下:如何阅读文本文件使用Actionscript 3?

//Read settings from TinkerProxy Config File 
var TextFileLoader:URLLoader = new URLLoader(); 
var ArrayOfLines:Array; 
TextFileLoader.addEventListener(Event.COMPLETE, onLoaded); 
TextFileLoader.load(new URLRequest("/tinkerproxy-2_0/serproxy.cfg")); 
//TextFileLoader.dataFormat = URLLoaderDataFormat.VARIABLES; 

function onLoaded(e:Event):void { 
    ArrayOfLines = e.target.data.split(/\r/); 
    trace(e.target.data); 
} 

trace(ArrayOfLines[0]); 

我真正想要做的是找到“net_port1 = 5331”在变量条目和存储“5331”。

这里是文本文件的样本:(或者更确切地说,我想读它,因为它产生)

# Generated by TinkerProxy Configurator 
# 

# Timeout in seconds 
# 0 means infinite, no timeout 

timeout=0 
newlines_to_nils=false 

comm_ports=1 

serial_device1=COM1 
net_port1=5331 
comm_baud1=9600 
comm_databits1=8 
comm_stopbits1=1 
comm_parity1=none 

该文件是自动生成的,所以我不能编辑它

我可以通过trace(e.target.data)查看数据,但我无法通过trace(ArrayOfLines[0]);访问数据。

我错过了什么?

在此先感谢。

+0

我试过'ArrayOfLines = e.target.data.split(/ \ n /);'以及。没有快乐。 – 2015-04-05 02:08:08

回答

0

您可能需要拆分\n (Unix) or \r\n (Windows)而不是\r

通常加载从文件系统中的文本文件,并破入行的时候,我做这个正常化行结尾:

var lines:Array = text.replace(/\r\n/g, "\n").split("\n"); 

然后你可以遍历线,并根据需要解码每个行。该文件看起来类似于.properties format,在AS3中没有内置解析器(如XML,JSON或URLVariables),但它非常简单。例如,这样的:

var props:Object = {}; 
for each(var line:String in lines){ 
    // skip blank lines and comment lines 
    if(line == "" || line.charAt(0) == "#") 
     continue; 
    var arr:Array = line.split("="); 
    if(arr.length == 2) 
     props[arr[0]] = arr[1]; 
} 

trace(JSON.stringify(props, null, 2)) 

输出这样的:

{ 
    "comm_parity1": "none", 
    "comm_ports": "1 ", 
    "newlines_to_nils": "false", 
    "comm_baud1": "9600", 
    "serial_device1": "COM1", 
    "comm_databits1": "8", 
    "timeout": "0", 
    "comm_stopbits1": "1", 
    "net_port1": "5331" 
} 

,它允许你通过名称来访问属性:

trace(props.net_port1); // "5331" 

(请注意,所有值都是字符串,因此,例如newlines_to_nils不是false,它是"false"。)

或者,你可以搜索你正在寻找的密钥,并提取你想要的数据:

var key:String = "net_port1="; 
var index:int = text.indexOf(key); 
if(index != -1){ 
    // extract text after the desired search key 
    var value:String = text.substring(index + key.length); 
    // parseInt will read until it hits a non-numeric character 
    var net_port1:int = parseInt(value); 
    trace(net_port1); // 5331 
} 
+0

是的,我知道它与返回类型有关,我使用的是Windows。 – 2015-04-05 04:38:27

+0

我想我的'(ArrayOfLines [0]);'也在函数之外。所以这也是问题。我即将发布我的最终解决方案。 – 2015-04-05 04:40:00

0

这是为我工作的解决方案。再次感谢亚伦对物业的回答。我可能会在将来使用它。

//Read settings from TinkerProxy Config File 
var TextFileLoader:URLLoader = new URLLoader(); 
var ArrayOfLines:Array; 
var Port:int; 
var COM:int; 
TextFileLoader.addEventListener(Event.COMPLETE, onLoaded); 
TextFileLoader.load(new URLRequest("/tinkerproxy-2_0/serproxy.cfg")); 

function findSubstring(array:Array, string:String):int { 
    for(var i:int = 0; i < array.length; i++){ 
     if(array[i].indexOf(string) > -1){ 
      return i; //Index of Substring 
     } 
    } 
    return -1; //Not Found 
} 

function onLoaded(e:Event):void { 
    ArrayOfLines = e.target.data.split(String.fromCharCode(13)); 

    if(findSubstring(ArrayOfLines, "net_port") > -1){ 
     Port = Number(ArrayOfLines[findSubstring(ArrayOfLines, "net_port")].split("=")[1]); 
    } 
    else{ 
     Port = 5331; //Default if not port is found. 
    } 

    if(findSubstring(ArrayOfLines, "serial_device1") > -1){ 
     COM = Number(ArrayOfLines[findSubstring(ArrayOfLines, "serial_device1")].split("serial_device1=COM")[1]); 
    } 
    else{ 
     COM = 1; //Default if not port is found. 
    } 

    trace("COM: " + COM + " Port: " + Port); 
}