2013-12-10 39 views
-1

我有一個以下格式的文本文件。Flash動作腳本:如何從文本文件中逐行提取變量?

39.570 -0.246 0.074 1.004 0
39.822 -0.344 0.094 0.887 0
40.083 -0.262 0.234 0.926 0
40.335 -0.457 0.160 0.813 0
40.578 -0.242 0.063 1.008 0
40.830 -0.285 0.172 0.988 0
41.082 -0.277 0.129 0.918 0
41.334 -0.332 0.145 0.996 0
41.586 -0.332 0.156 0.910 0
41.843 -0.340 0.160 0.941 0
42.092 -0.371 0.121 0.793 0

正如您所見,沒有區分字符可將數據分解爲變量。我需要做的是將每行分成5個單獨的變量

例如, 39.570 -0.246 0.074 1.004 0

將是

變種timestamp01 = 39.570

變種xaccel01 = -0.246

變種yaccel01 = 0.074

變種zaccel01 = 1.004

變種boardheat01 = 0

和t對每行重複一次帽子直到文檔結束,其中每個變量具有不同的值,這取決於它所在的行是哪一行。 timestamp02將涉及第二行的第一個數字,例如39.822

我不斷查找部分信息,但通常最終需要在文本文件中標識(& &以及類似的東西)。

這是我到目前爲止有:

import flash.filesystem.File; 
import flash.filesystem.FileMode; 
import flash.filesystem.FileStream; 

movieClip_1.addEventListener(MouseEvent.CLICK, fl_OpenFile); 

var fl_OpenFileStream:FileStream = new FileStream(); // FileStream used to read from the file 
var fl_OpenFileChooser:File = File.documentsDirectory; // Default to the documents directory 
fl_OpenFileChooser.addEventListener(Event.SELECT, fl_FileOpenSelected); 

// Main function for opening a file 
function fl_OpenFile(event:MouseEvent):void 
{ 
    fl_OpenFileChooser.browseForOpen("Select a text file."); 
} 

// Opens a FileStream object to read the file 
function fl_FileOpenSelected(event:Event):void 
{ 
    fl_OpenFileChooser = event.target as File; 
    fl_OpenFileStream = new FileStream(); 
    fl_OpenFileStream.addEventListener(Event.COMPLETE, fl_FileReadHandler); 

    fl_OpenFileStream.openAsync(fl_OpenFileChooser, FileMode.READ); 
} 

// Write data from the file to the Output Panel 
function fl_FileReadHandler(event:Event):void 
{ 
    var fileData:String = fl_OpenFileStream.readMultiByte(fl_OpenFileStream.bytesAvailable, File.systemCharset); 
    // The data loaded from the file can now be used from the variable fileData. 

    //Split the string by a newline character 
var arLines:Array = fileData.split("n"); 

var x; 


for each (var singleLine:String in arLines) 
{ 
    //More code coming up 
    x = String(arLines).substr(0,6) 
    // This example code displays data from the file in the Output panel. 
    outputMod.text = String(x); 

} 


    fl_OpenFileStream.close(); 
} 

其中x是數據的第一行的第一位。你會注意到我的編程技巧很低,但只要我有一個出發點,我就可以快速學習。如果有人能夠解釋這個問題,或者甚至指出我會朝着正確的方向發展,那將是輝煌的。

+0

你應該能夠分割空格字符上的每一行。 x = singleLine.split(''); var timestamp01 = x [0]; //等等 –

回答

0

與外觀相同的物品處理通常希望將它們放在某種你可以迭代的容器(array/vector)。

在這個解決方案中,我用匿名對象做了它,但是如果你願意,它們可以很容易地擴展到一個類中。

function FileParser() { 
    var input:String = "39.570 -0.246 0.074 1.004 0\n" + "39.822 -0.344 0.094 0.887 0\n" + "40.083 -0.262 0.234 0.926 0\n" + 
    "40.335 -0.457 0.160 0.813 0\n" + "40.578 -0.242 0.063 1.008 0\n" + "40.830 -0.285 0.172 0.988 0\n" + "41.082 -0.277 0.129 0.918 0\n" + 
    "41.334 -0.332 0.145 0.996 0\n" + "41.586 -0.332 0.156 0.910 0\n" + "41.843 -0.340 0.160 0.941 0\n" + "42.092 -0.371 0.121 0.793 0"; 

    var data:Array = new Array(); 
    var rows:Array = input.split("\n"); 
    for (var i:int = 0; i < rows.length; i++) 
    { 
     var parts:Array = rows[i].split(" "); 
     if (parts.length == 5) { 
      data.push({ 
       timestamp:parts[0], 
       xAccel:parts[1], 
       yAccel:parts[2], 
       zAccel:parts[3], 
       boardHeat:parts[4] 
      }); 
     } else { 
      throw new Error("Invalid number of values for row:" + rows[i]); 
     } 

    } 

    trace("...iterating over data..."); 
    for (var j:int = 0; j < data.length; j++) 
    { 
     trace("timestamp for item #" + j + "=" + data[j].timestamp); 
    } 
} 

輸出:

...iterating over data... 
timestamp for item #0=39.570 
timestamp for item #1=39.822 
timestamp for item #2=40.083 
timestamp for item #3=40.335 
timestamp for item #4=40.578 
timestamp for item #5=40.830 
timestamp for item #6=41.082 
timestamp for item #7=41.334 
timestamp for item #8=41.586 
timestamp for item #9=41.843 
timestamp for item #10=42.092 
0

這將在一個正常的批處理文件...不知道關於Actionscript。

我在底部添加了ECHO行,因此您可以通過檢查它將創建的文件Output.txt來檢查輸出的工作情況。

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET sourcefile=list01.txt 
SET outputfile=output.txt 

:start 
SET count=000 
FOR /f "tokens=* delims= " %%a IN (%sourcefile%) DO CALL :process1 %%a 
PAUSE 
GOTO :eof 

:process1 
SET /a count=%count%+1 
SET timestamp%count%=%1 
SET xaccel%count%=%2 
SET yaccel%count%=%3 
SET zaccel%count%=%4 
SET boardheat%count%=%5 
ECHO Row !count!>>%outputfile% 
ECHO Time Stamp:!timestamp%count%! X-accel:!xaccel%count%! Y-accel:!yaccel%count%! Z-accel:!zaccel%count%! Board Heat:!boardheat%count%!>>%outputfile% 
GOTO :eof 

使用上面的輸入列表,這批輸出文件應該是這樣的......

Row 1 
Time Stamp:39.570 X-accel:-0.246 Y-accel:0.074 Z-accel:1.004 Board Heat:0 
Row 2 
Time Stamp:39.822 X-accel:-0.344 Y-accel:0.094 Z-accel:0.887 Board Heat:0 
Row 3 
Time Stamp:40.083 X-accel:-0.262 Y-accel:0.234 Z-accel:0.926 Board Heat:0 
Row 4 
Time Stamp:40.335 X-accel:-0.457 Y-accel:0.160 Z-accel:0.813 Board Heat:0 
Row 5 
Time Stamp:40.578 X-accel:-0.242 Y-accel:0.063 Z-accel:1.008 Board Heat:0 
Row 6 
Time Stamp:40.830 X-accel:-0.285 Y-accel:0.172 Z-accel:0.988 Board Heat:0 
Row 7 
Time Stamp:41.082 X-accel:-0.277 Y-accel:0.129 Z-accel:0.918 Board Heat:0 
Row 8 
Time Stamp:41.334 X-accel:-0.332 Y-accel:0.145 Z-accel:0.996 Board Heat:0 
Row 9 
Time Stamp:41.586 X-accel:-0.332 Y-accel:0.156 Z-accel:0.910 Board Heat:0 
Row 10 
Time Stamp:41.843 X-accel:-0.340 Y-accel:0.160 Z-accel:0.941 Board Heat:0 
Row 11 
Time Stamp:42.092 X-accel:-0.371 Y-accel:0.121 Z-accel:0.793 Board Heat:0 
0

如果我是你,我會使用正則表達式匹配數據的模式。

首先,獲取所有行。下面的模式是許多可能的解決方案之一:

var reg1:RegExp = /[\d-. ]*[\n]{1}/g; 
var lineArray:Array = yourString.match(reg1); 

現在你有行的數組,像這樣:

39.570 -0.246 0.074 1.004 0 
,39.822 -0.344 0.094 0.887 0 
,40.083 -0.262 0.234 0.926 0 
,40.335 -0.457 0.160 0.813 0 
,40.578 -0.242 0.063 1.008 0 
,40.830 -0.285 0.172 0.988 0 
,41.082 -0.277 0.129 0.918 0 
,41.334 -0.332 0.145 0.996 0 
,41.586 -0.332 0.156 0.910 0 
,41.843 -0.340 0.160 0.941 0 

循環通過該數組併爲每個循環創建一個對象,將保存數據:

for (var i:int = 0; i < lineArray.length; i++) 
{ 
    var line:String = lineArray[i]; 
    var dataObject:CustomDataObject = new CustomDataObject(); // create your own class, I named this CustomDataObject 
    // here, break the line into smaller chunks that are separated by a space 
    var variableArray:Array = line.split(" "); 

    dataObject.yourVar1 = Number(variableArray[0]); 
    dataObject.yourVar2 = Number(variableArray[1]); 
    dataObject.yourVar3 = Number(variableArray[2]); 
    dataObject.yourVar4 = Number(variableArray[3]); 
    dataObject.yourVar5 = Number(variableArray[4]); 
} 

就是這樣!