使用 dxl 将 DOORS 对象导出到 csv 文件不会写入所有对象?
Exporting DOORS Objects to csv files with dxl wont write all objects?
我为 DOORS 9.5 编写了一个脚本,它在 DOORS 模块中查找特定对象并将它们写入 csv 文件。但是,在特定数量的行之后,它停止在 csv 文件中写入,我只得到了我请求的对象的一半。
我正在使用我在互联网上找到的字符串替换功能。所以这可能是问题所在,或者 dxl 在 csv 文件中写入是否有某种最大值?
如果有人能帮助我,那就太好了,因为我无法在互联网上找到任何解决方案,也无法理解为什么这行不通。
// String replacement function
string replace (string sSource, string sSearch, string sReplace)
{
int iLen = length sSource
if (iLen == 0) return ""
int iLenSearch = length(sSearch)
if (iLenSearch == 0)
{
print "search string must not be empty"
return ""
}
// read the first char for latter comparison -> speed optimization
char firstChar = sSearch[0]
Buffer s = create()
int pos = 0, d1,d2;
int i
while (pos < iLen) {
char ch = sSource[pos];
bool found = true
if (ch != firstChar) {pos ++; s+= ch; continue}
for (i = 1; i < iLenSearch; i++)
if (sSource[pos+i] != sSearch[i]) { found = false; break }
if (!found) {pos++; s+= ch; continue}
s += sReplace
pos += iLenSearch
}
string result = stringOf s
delete s
return result
}
Module m = read(modulePath, false)
Object o
string s
string eval
Stream outfile = write("D:\Python\Toolbeta\data\modules\test.csv")
for o in m do
{
eval = o."Evaluation Spec Filter"
if(eval == "Evaluation Step Object")
{
s = o."Object Text"
s = replace(s,"\n","\n")
outfile2 << o."HierarchyNumber" ";" s "\n"
}
}
close outfile
据我所知,输出到 CSV 文件没有行数限制。
但我确实在您的替换函数中看到了一些奇怪的地方。您的 sSearch
变量始终是 \n
,就 DOORS 而言,它是 1 个字符(回车符 return)。但在下一行 i=1
:
if (sSource[pos+i] != sSearch[i]) { found = false; break }
sSearch
在位置 1
没有任何字符,因为字符串数组从 0
.
开始
我认为您需要将 for 循环更改为:
for (i = 0; i < iLenSearch; i++)
我的猜测是您的脚本在第一次找到带有回车 return 的对象时失败了。
如果有帮助请告诉我,祝你好运!
将对象文本输出到 CSV 时,您需要注意很多问题。您是否负责替换逗号,或者至少引用文本?如果对象文本中有 OLE 怎么办?等等
如果您手动执行此操作,我建议设置一个视图,其中包含您想要查看的属性作为列和过滤器以仅包含您想要查看的对象,然后使用本机 DOORS 导出到 Excel(模块 window:文件 > 导出 > Microsoft Office > Excel)。如果您真的需要 CSV,您可以从 Excel 保存为 CSV。
如果您使用脚本自动执行此操作,我建议为 Excel 使用 DXL 库,例如:http://www.baselinesinc.com/dxl-repository/
(但请注意,在 Windows 计划任务中使用 Excel 会出现问题。)
如果您无权访问 Excel,那么您可能会在网上四处寻找一些用于写入 CSV 的 C 代码,并以此为基础创建 DXL。
希望对您有所帮助。
编辑:此外,这里有一个 link 用于转义的好函数:https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014627043
我终于找到了问题的解决方案(我知道替换功能有点糟糕^^)。
dxl 脚本似乎有一个内部计时器。当计时器到时,即使进程仍在执行,脚本也会自动结束。所以我的脚本总是在 x 秒后停止,这就是我从未在我的 csv 文件中获取所有数据的原因。
如果您遇到同样的问题,请尝试 pragma runLim,0
。它将计时器设置为无限制。您也可以通过将 0 替换为任意数字来选择计时器。 (就我而言,2000000 最合适)。
感谢所有答案和帮助
我为 DOORS 9.5 编写了一个脚本,它在 DOORS 模块中查找特定对象并将它们写入 csv 文件。但是,在特定数量的行之后,它停止在 csv 文件中写入,我只得到了我请求的对象的一半。 我正在使用我在互联网上找到的字符串替换功能。所以这可能是问题所在,或者 dxl 在 csv 文件中写入是否有某种最大值?
如果有人能帮助我,那就太好了,因为我无法在互联网上找到任何解决方案,也无法理解为什么这行不通。
// String replacement function
string replace (string sSource, string sSearch, string sReplace)
{
int iLen = length sSource
if (iLen == 0) return ""
int iLenSearch = length(sSearch)
if (iLenSearch == 0)
{
print "search string must not be empty"
return ""
}
// read the first char for latter comparison -> speed optimization
char firstChar = sSearch[0]
Buffer s = create()
int pos = 0, d1,d2;
int i
while (pos < iLen) {
char ch = sSource[pos];
bool found = true
if (ch != firstChar) {pos ++; s+= ch; continue}
for (i = 1; i < iLenSearch; i++)
if (sSource[pos+i] != sSearch[i]) { found = false; break }
if (!found) {pos++; s+= ch; continue}
s += sReplace
pos += iLenSearch
}
string result = stringOf s
delete s
return result
}
Module m = read(modulePath, false)
Object o
string s
string eval
Stream outfile = write("D:\Python\Toolbeta\data\modules\test.csv")
for o in m do
{
eval = o."Evaluation Spec Filter"
if(eval == "Evaluation Step Object")
{
s = o."Object Text"
s = replace(s,"\n","\n")
outfile2 << o."HierarchyNumber" ";" s "\n"
}
}
close outfile
据我所知,输出到 CSV 文件没有行数限制。
但我确实在您的替换函数中看到了一些奇怪的地方。您的 sSearch
变量始终是 \n
,就 DOORS 而言,它是 1 个字符(回车符 return)。但在下一行 i=1
:
if (sSource[pos+i] != sSearch[i]) { found = false; break }
sSearch
在位置 1
没有任何字符,因为字符串数组从 0
.
我认为您需要将 for 循环更改为:
for (i = 0; i < iLenSearch; i++)
我的猜测是您的脚本在第一次找到带有回车 return 的对象时失败了。
如果有帮助请告诉我,祝你好运!
将对象文本输出到 CSV 时,您需要注意很多问题。您是否负责替换逗号,或者至少引用文本?如果对象文本中有 OLE 怎么办?等等
如果您手动执行此操作,我建议设置一个视图,其中包含您想要查看的属性作为列和过滤器以仅包含您想要查看的对象,然后使用本机 DOORS 导出到 Excel(模块 window:文件 > 导出 > Microsoft Office > Excel)。如果您真的需要 CSV,您可以从 Excel 保存为 CSV。
如果您使用脚本自动执行此操作,我建议为 Excel 使用 DXL 库,例如:http://www.baselinesinc.com/dxl-repository/
(但请注意,在 Windows 计划任务中使用 Excel 会出现问题。)
如果您无权访问 Excel,那么您可能会在网上四处寻找一些用于写入 CSV 的 C 代码,并以此为基础创建 DXL。
希望对您有所帮助。
编辑:此外,这里有一个 link 用于转义的好函数:https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014627043
我终于找到了问题的解决方案(我知道替换功能有点糟糕^^)。
dxl 脚本似乎有一个内部计时器。当计时器到时,即使进程仍在执行,脚本也会自动结束。所以我的脚本总是在 x 秒后停止,这就是我从未在我的 csv 文件中获取所有数据的原因。
如果您遇到同样的问题,请尝试 pragma runLim,0
。它将计时器设置为无限制。您也可以通过将 0 替换为任意数字来选择计时器。 (就我而言,2000000 最合适)。
感谢所有答案和帮助