首页 > 解决方案 > 解析文本文件或 html 文件以创建表格

问题描述

我对来自 Outlook 的 .msg 文件有一个简单的问题,但我发现有人帮助我的代码无法正常工作,因为 .msg 文件中的 htmlbody 在不同的电子邮件之间会有所不同,即使它们来自相同的来源,所以我的下一个选择是将电子邮件另存为 .txt 和 .html 文件,因为我不了解 html 我不知道如何获取以 .html 为结构的表格。但在文本中我发现了一些简单的东西,例如这是来自一个表的数据:

Summary
Date
Good mail
Rule matches
Spam
Malware
2019-10-22
4927
4519
2078
0
2019-10-23
4783
4113
1934
0

这是在文本文件上,Summary 是关键字,在该关键字之后,接下来的 5 行是表格的列,之后每 5 行是行,总共最多 7 行,所以标题,然后是 7 行。

现在我要做的是使用摘要后的前 5 行作为我的列从该文本创建一个表。由于每个 .msg 都不同,这 5 列将随机更改每个文件的顺序,所以我想避免这种情况,我最好的尝试是使用 convertfrom-string 创建一个表,但我不知道如何格式化表上面设定的条件。

我遇到的问题就是这么简单,我在上面显示的txt文件上有一个表格,有5列,除了标题之外的每一列都包含7行,还有一个条件是电子邮件因为它有更多的数据,我需要停在那里,只抓住应该很容易的部分。

如何使用 convertfrom-string 使用这 5 列创建表,如何将分隔符设置为新行,如何将前 5 行设置为列标题?

标签: powershell

解决方案


我认为尝试完成这项工作ConvertFrom-StringData会增加不必要的工作量。但这里有一个适用于您的样本集的替代方案。

$text = Get-Content -Path File.txt
$formattedText = if ($text[0] -match '^Summary') {
                   for ($i = 1; $i -lt $text.count; $i+=5 ) {
                     $text[$i..($i+4)] -join ','
                   }
                 }
$fomattedText | ConvertFrom-Csv | ConvertTo-Html

解释:

如果我们假设您的文本数据在 中File.txt,则Get-Content用于将数据作为数组 ( $text) 读取。如果第一行以 开头Summary,则文件将被解析。

for循环用于在每次迭代期间跳过 5 行,直到文件结束。for循环以由 a 连接在一起的$text值(索引 1、2、3、4 和 5)开始,。然后索引增量 ( $i) 增加 5 并将接下来的五个索引值连接在一起。每个增量将创建一个新的逗号分隔值行。加入的原因,只是为了ConvertFrom-Csv后面使用简单。

ConvertFrom-Csv将 CSV 数据转换为对象数组 ( $formattedText),第一行成为这些对象的属性。

最后,数组通过管道传送到ConvertTo-Html,它将输出表中的所有对象。


注意:如果您想调整表格的大小或向表格添加额外的格式,您可能需要在生成代码后执行此操作。如果您的数据有逗号,则在连接字符串时将需要不同的分隔符。然后,您需要使用您选择的分隔符将-Delimiter参数添加到。ConvertFrom-Csv


适应:

代码相当灵活。如果您需要处理超过五个属性,$i+=5则需要反映您需要循环访问的属性数量。相同的更改需要适用于$text[$i..($i+4)]. 您希望..分隔两个因您的属性编号而异的值。


推荐阅读