IMacros从/向CSV文件读取/写入

时间:2016-01-20 10:51:31

标签: javascript java firefox imacros

我已经在用于Firefox的IMacros Add-on中编写了一个Java代码,用于从CSV文件中获取信息。 javascript用于控制另一个宏。一切都很好,直到我想改进它。 CSV文件的结构如下:

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

我尝试计算CSV文件中的行数,但最后是在文件中手动指定行。

问题是(使用java脚本宏,有两个java脚本,第一个控制第二个):

1)从CSV文件中读取信息并将其写入变量

2)将此变量用作循环计数器和另一个宏

3)将上次使用的行号写入CSV文件,以便下次启动时它将从停止的位置继续

虽然我成功地能够从CSV文件中读取信息,但其他一切都变得复杂了。我已经尝试过不同的方式,但不知怎的,现在它只读取文件的第一行,如果要指定SET !DATASOURCE_LINE 1SET !DATASOURCE_LINE 3,并且如果该行为{{{I}}则根本不执行任何操作1}}或2

如果要将所有代码放在一个java脚本中并按指定的顺序调用子宏,那么之前一切正常。但是如果要从第一个调用第二个java脚本,就会出现在它们之间传递变量的问题(以及如果不按特殊顺序调用子宏)。

我在IMacros版本中使用的东西在执行程序时看不到变量值,因此调试非常有限,一切都变得非常复杂。
这是代码:

4

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" ; 将被放置在另一个java脚本宏中,该宏将调用指定其他所有内容的第二个宏。将值写入CSV文件由于上述问题,我还没有实现。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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);
}