如何使用 Actionscript 3 读取文本文件?
How to Read a Text file Using Actionscript 3?
我正在尝试读取我的 air 项目中的文本文件。它实际上是 TinkerProxy 使用的配置文件。到目前为止我有以下内容:
//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]);
访问数据。
我错过了什么?
提前致谢。
您可能需要在 \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
}
这是对我有用的解决方案。再次感谢亚伦对属性的回答。我以后可能会用到它。
//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);
}
我正在尝试读取我的 air 项目中的文本文件。它实际上是 TinkerProxy 使用的配置文件。到目前为止我有以下内容:
//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]);
访问数据。
我错过了什么?
提前致谢。
您可能需要在 \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
}
这是对我有用的解决方案。再次感谢亚伦对属性的回答。我以后可能会用到它。
//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);
}