早上好!! 几周来我一直在用头撞墙,试图解决这个问题,但我已经没有想法了。
我想将构建列表上的所有主要/替代品分组在一起,然后我可以将其与其他构建列表上的所有其他主要/替代品进行比较,并根据所使用的主要产品提出将替代品添加到其他零件编号的建议。
附件是一个示例文件。 为简单起见,我使所有主要/备用组都以相同的数字(即 20 或 40)开头,但最后的数字不同。 可以通过查看装配和位置来形成零件编号的初始组,然后将组添加到其他组(如果它们有任何共同点)。 我试图使用关联数组,但我不确定这是否是正确的方法。
预先感谢大家提供的任何帮助!
谢谢大家的意见!我与一位同事分享了这个问题,他想出了另一种方法——更多的是暴力方法。
附件是执行我正在寻找的操作的脚本。基本上,我们将表本身连接起来以将零件编号分组,然后再次连接到 assembly_location 以获取所有零件编号。
经过一些汇总和来回转置后,结果是一个列表,其中所有备用/主要组都在单列中,并用分组值标记。
再次感谢!
布莱恩
@SirBWhite你提出了一个有趣的问题,我希望有一些优雅的方法来做到这一点。 吉姆的, @tx尼尔森的,建议让我考虑了冒泡排序和相似类型分析。我希望有一些文本挖掘解决方案和文本距离度量可以使这成为一项简单的任务。
根据您与吉姆的讨论,我将重新组织数据:
生成的表格(下面显示的一部分)将大大减少可比组件的选择。

这是该表的图形化图片

附上执行此操作的脚本。我要做的如下:
- 在原始列中添加一个名为“类型代码”的列,当 Type = PRM 时为 2,当 Type= ALT 时为 1。
- 然后拆分表(临时)并用零重新编码缺失
- 我仍然会对表格进行排序,但这是不必要的。
该表的零件列现在是数字列,可用于聚类算法和最近邻算法。
谢谢@tx尼尔森!我喜欢这种方法,但并非所有组件都可以使用相同的零件编号构建,并且很难查看数千个组件和零件。我可能过于简化了我的示例,并在其之上添加了非常复杂的解释。
我在我认为可行的方法上取得了一些进展。我能够弄清楚如何为每个装配位置及其附带的零件编号动态创建关联数组。这是脚本:
dt=Data Table( "Example" );
//Combine columns to get a single unique identifer for each row
dt << Combine Columns(
delimiter( "_" ),
Columns( :Assembly, :Location ),
Selected Columns are Indicator Columns( 0 ),
Column Name( "Assembly_Location" )
);
//Creates columns for each Assembly_Location - Grouping Like Part numbers together
dt1=dt << Split(
Split By( :Assembly_Location ),
Split( :Part Number ),
Remaining Columns( Drop All ),
Sort by Column Property, <BR /> Table Name ("Transposed Example")
);
//Get all column names as a list
allnames=dt1<<GET column="" names=""></GET>//Create an associative array for every column with the column name used as the array name
for (i = 1, i <= nitems(allnames), i++,
<BR />// If it's a string column then create the column name and an array name for use as a dynamic input
if (is string(allnames[i]),
col_name = "dt1:Name(\!"" || allnames[i]||"\!")" ;
array_name = "aa" || allnames[i];
// Build associative array string dynamically and then execute it.
str = evalinsert(
"\[^array_name^=Associative Array (^col_name^) ;]\");
eval(parse(str));
);
);
aaKBR175_001;<BR />aaKBR175_002;<BR />aaKBR175_003;
现在我想将每个数组与其他数组进行比较,看看是否有重叠。如果有的话,我想合并数组。 例如,查看 KBR175-001 (20-0002、20-0003、20-0004、20-0005)、TRT330-003(20-0002、20-0003、20-0004)、NTE484-001(20-0002、20-0003、20-0005) 、20-0007)、KNW995-002 (20-0002、20-0003、20-0004、20-0005)。 结果将是:(20-0002、20-0003、20-0004、20-0005、20-0007)。
我认为我可以使用相交运算,但这会用相交结果替换第一个数组:
//Creates an Associative Array for each two columns
aa1=Associative Array (dt1:Name("KBR175_001") );
aa3=Associative Array (dt1:Name("NTE484_001") );
//Looks for overlap<BR />aa1 << intersect ( aa3 );
Show(N Items(aa1));
//If there is overlap, it combines the two Arrays into one, otherwise it returns "no"
if (N Items (aa1)>0, aa1<< Insert( aa3 ), Show("no"));但这只给了我aa1和aa3加上aa3或{“20-0002”,“20-0003”,“20-0005”,“20-0007”}的交集我已经排除了“20-0004”,它最初是aa1 的一部分。
我的问题分为两部分:
1. 有没有办法比较数组,然后组合两个数组以包含所有键?
2. 如何将所有数组与所有其他数组进行比较? 我假设某种 For 循环。
您是否想要这样的东西,您可以在其中查看哪些组件尚未用于特定零件号?

抱歉,解释令人困惑。 我希望这能澄清一点:最后,我想看到以下组{“20-0002”,“20-0003”,“20-0004”,“20-0005”,“20- 0007”}我可以与所有其他组件进行比较。 例如,KBR175、TRT330 或 KNW995 上未标注 20-0007 部件号,但我们建议将其作为替代品。
你的解释让我很困惑。是否可以提供您期望的输出的一小部分样本?