2016-01-20 158 views
0

我已經在Firefox的IMacros插件中編寫了一個Java代碼,用於從CSV文件獲取信息。 javascript用於控制另一個宏。一切都很好,直到我想改善它。 CSV文件的結構如下:IMacros讀取/寫入CSV文件

LASTLINEUSED, NUMBEROFLINES 
4,10 
NAME, SURNAME 
A,B 
C,D 
E,F 
... 
M,N 

我試着計算CSV文件中的行數,但以文件中手動指定它結束。

被(用java腳本宏,有2 java的腳本的第一控制第二)問題:

1)讀取從CSV文件信息,並將其寫入到可變

2 )使用這個變量作爲循環計數器,而在另一個宏

3)編寫最後使用的線到CSV文件的數量,以便在下次啓動時它會繼續從停止的地方

雖然我成功了能夠實現d來自CSV文件的信息一切都變得複雜。我嘗試了不同的方式,但現在它只讀取文件的第一行,如果指定SET !DATASOURCE_LINE 1SET !DATASOURCE_LINE 3,並且如果行是24,則根本不執行任何操作。

如果要將所有代碼放在一個java腳本中並按指定的順序調用子宏,那麼以前的所有功能都可以正常工作。但是如果從第一個調用第二個java腳本出現傳遞變量的問題(以及如果不按特殊順序調用子宏)。

在IMacros版本中,我使用的是在執行程序時看不到變量值,所以調試非常有限,一切都變得非常複雜。
下面是代碼:

var lastUsedLine; 
lastUsedLine = "CODE:"; 
lastUsedLine += "SET !ERRORIGNORE YES" + "\n"; 
lastUsedLine += "SET !TIMEOUT_TAG 3" + "\n"; 
lastUsedLine += "SET !TIMEOUT_STEP 3" + "\n"; 
lastUsedLine += "SET !DATASOURCE MyInformation.csv" + "\n"; 
lastUsedLine += "SET !DATASOURCE_LINE 2" + "\n"; 
lastUsedLine += "ADD !EXTRACT {{!COL1}}" + "\n"; 
lastUsedLine += "ADD !EXTRACT {{!COL2}}" + "\n"; 
iimPlay(lastUsedLine); 

var currentLine = iimGetLastExtract(1); 
var numberOfLines = iimGetLastExtract(2); 

for (a = currentLine; a < (numberOfLines + 1); a++) 
{ 
iimPlay(macro1); 
//iimSet ("CURRENTLINE", a); 
//--- This CURRENTLINE worked before but only if it is placed one line before the sub-macro where it will be used 
iimPlay(processingInformation); 
} 

var processingInformation; 
processingInformation = "CODE:"; 
processingInformation += "SET !ERRORIGNORE YES" + "\n"; 
processingInformation += "SET !TIMEOUT_TAG 3" + "\n"; 
processingInformation += "SET !TIMEOUT_STEP 3" + "\n"; 
processingInformation += "SET !TIMEOUT_PAGE 60" + "\n"; 
processingInformation += "TAB T=1" + "\n"; 
processingInformation += "TAB CLOSEALLOTHERS" + "\n"; 
processingInformation += "SET !DATASOURCE MyInformation.csv" + "\n"; 
processingInformation += "SET !DATASOURCE_LINE {{currentLine}}" + "\n"; 
processingInformation += "URL GOTO=http://www.example.com/" + "\n" ; 
processingInformation += "TAG POS=1 TYPE=INPUT:Name ATTR=ID:id1 CONTENT={{!COL1}}" + "\n" ; 
processingInformation += "TAG POS=1 TYPE=INPUT:SURNAME ATTR=ID:id2 CONTENT={{!COL2}}" + "\n" ; 
processingInformation += "TAG POS=1 TYPE=INPUT:SUBMIT ATTR=ID:done" + "\n" ; 

For loop將被放置在另一個Java腳本宏,將調用已指定一切第二。將值寫入CSV文件由於上述問題,我尚未實現。

謝謝你的幫助!

回答

1

讓您的CSV文件的結構如下所示:

NAME, SURNAME 
A,B 
C,D 
E,F 
... 
M,N 

嘗試下面的作品JS腳本,以及如何修改它爲您的需求:

var lastUsedLine = "SET !DATASOURCE MyInformation.csv" + "\n"; 
lastUsedLine += "SET !DATASOURCE_LINE {{currentLine}}" + "\n"; 
lastUsedLine += "SET !EXTRACT {{!COL1}}" + "\n"; 
lastUsedLine += "ADD !EXTRACT {{!COL2}}" + "\n"; 

var processingInformation = "SET !ERRORIGNORE YES" + "\n"; 
processingInformation += "SET !TIMEOUT_STEP 3" + "\n"; 
processingInformation += "SET !TIMEOUT_PAGE 60" + "\n"; 
processingInformation += "TAB T=1" + "\n"; 
processingInformation += "TAB CLOSEALLOTHERS" + "\n"; 
processingInformation += "URL GOTO=http://www.example.com/" + "\n" ; 
processingInformation += "TAG POS=1 TYPE=INPUT:Name ATTR=ID:id1 CONTENT={{name}}" + "\n" ; 
processingInformation += "TAG POS=1 TYPE=INPUT:SURNAME ATTR=ID:id2 CONTENT={{surname}}" + "\n" ; 
processingInformation += "TAG POS=1 TYPE=INPUT:SUBMIT ATTR=ID:done" + "\n" ; 

for (i = 2; ; i++) { 
    iimSet("currentLine", i); 
    if (iimPlayCode(lastUsedLine) != 1) 
     break; 
    var ext = iimGetExtract().split("[EXTRACT]"); 
    iimDisplay(i + " >>> " + ext.join(" ")); 

    iimSet("name", ext[0]); 
    iimSet("surname", ext[1]); 
    iimPlayCode(processingInformation); 
} 
+0

謝謝@Shugar,真有意思在if語句中使用調用代碼,我現在理解原則,並且會從這裏進一步走下去。 – Samuel