处理两种不同的 Excel 标题格式大家好,
我正在 JMP 中编写一个 JSL 脚本,用于自动导入 BOM(物料清单)Excel 文件。这些文件来自不同的来源,遗憾的是格式不一致。
我正在处理两种特定格式:
- 格式 1:标题位于第 5 行,数据从第 6 行开始
- 格式 2:标题位于第 6 行,数据从第 7 行开始
现在,我的脚本被硬编码为使用格式 1(标题从行 (5) 开始),但每当我收到格式 2 的文件时,我都需要手动调整它。
目标:我想让脚本足够智能,能够自动检测正确的格式并应用适当的导入设置(标题从行开始,数据从行开始),而无需人工干预。
以下是当前脚本的片段:
For( i = 1, i <= N Items (namefiles), i++,
//Transformation du fichier en table de données
dt = Open(
namefiles[i],
Worksheets( "BOM" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 5 ),
Data Starts on Row( 6 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);<BR />...<BR />...<BR />...
有人遇到过类似的问题吗?我正在寻找:
- 一种检查 Excel 文件前几行(或许可以使用临时导入)的方法,可以推断文件头的实际起始位置。例如,通过检查已知的列名。
- 或者任何 JSL 技术可以更灵活地处理这种可变性。
自动化和脚本数据混合和清理质量与工艺工程视窗回复:处理两种不同的 Excel 标题格式您能否提供这两种不同格式文件的样本?这将有助于确定采用的方法。我通常的做法是,先将前7行作为一列读取。然后解析整个表格以确定其格式,最后使用确定的格式读取完整的表格。
回复:处理两种不同的 Excel 标题格式非常感谢您的回复。
我附上了两个样本,每个格式一个。
我将研究如何实现您的建议,看看是否可以成功地将前 7 行读取为单个列,然后解析表格以确定其格式并使用确定的格式读取完整的表格。
我非常感谢您的帮助!
回复:处理两种不同的 Excel 标题格式Jim 的建议很棒,另一个选择是提取更多数据,然后在 JMP 中进行清理
Names Default To Here(1);
path = "$DOWNLOADS/BOM_191910000_Sample_Row5.xlsx";
//path = "$DOWNLOADS/BOM_212100000-A2_Sample_Row6.xlsx";
dt = Open(
path,
Worksheets("BOM"),
Use for all sheets(1),
Concatenate Worksheets(0),
Create Concatenation Column(0),
Worksheet Settings(
1,
Has Column Headers(0),
Data Starts on Row(5),
Data Starts on Column(1),
Data Ends on Row(0),
Data Ends on Column(0),
Replicated Spanned Rows(1),
Replicated Spanned Headers(0),
Suppress Hidden Rows(1),
Suppress Hidden Columns(1),
Suppress Empty Columns(1),
Treat as Hierarchy(0),
Multiple Series Stack(0),
Import Cell Colors(0),
Limit Column Detect(0),
Column Separator String("-")
)
);
header_row = Contains(dt[0, 1], "PART NUMBER");
If(header_row > 1,
dt << Delete Rows(1::header_row-1);
);
dt << Move up;
//empty_rows = dt << Get Rows Where(IsMissing(AsColumn(dt, 1)));
//dt << delete rows(empty_rows);回复:处理两种不同的 Excel 标题格式在您的电子表格中,如果使用长度为 6 的标题读入的第一列的名称包含有效数字,则数据起始行是 6,否则为 6。
这是一个你可以开始的例子
For( i = 1, i <= N Items( namefiles ), i++,
//Transformation du fichier en table de données
dt = Open(
namefiles[i],
Worksheets( "BOM" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 6 ),
Headers Start on Row( 1 ),
Data Starts on Row( 7 ),
Data Starts on Column( 1 ),
Data Ends on Row( 7 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
If( Is Missing( Num( Word( -1, Column( 1 )[1] ) ) ) == 0,
whatStartRow = 7;
whatHeaderStartRow = 6;
,
whatStartRow = 6;
whatHeaderStartRow = 5;
);
Close( dt, nosave );
dt = Open(
namefiles[i],
Worksheets( "BOM" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( whatHeaderStartRow ),
Data Starts on Row( whatStartRow ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
);