我使用的是 Mac。我的 excel 文件的标题匹配,但顺序混乱。它们都以名为“query”的标题开头,之后就混杂在一起了。
以下是一些标题示例:
- 查询|电子邮件|facebookUrl|twitterUrl|电话号码|时间戳|instagramUrl|错误|linkedinUrl|youtubeUrl
- 查询|facebookUrl|linkedinUrl|电话号码|时间戳|youtubeUrl|电子邮件|错误|instagramUrl|twitterUrl
- 查询|电子邮件|facebookUrl|instagramUrl|时间戳|linkedinUrl|youtubeUrl|电话号码|twitterUrl|错误
我可以使用终端将所有 csv 文件与 合并cat *.csv >combined.csv
。但效果不佳,因为所有标题都乱序了。
有什么想法我可以做什么吗?
答案1
您必须使用支持 CSV 的工具。一个很好的工具是磨坊主
例如,如果你有这 3 个 CSV 文件
#input_01.csv
a,b,c
0,2,5
#input_02.csv
b,a,c
0,2,5
#input_03.csv
b,a
0,2
你可以mlr --csv unsparsify ./input_0*.csv >./output.csv
跑去
+---+---+---+
| a | b | c |
+---+---+---+
| 0 | 2 | 5 |
| 2 | 0 | 5 |
| 2 | 0 | - |
+---+---+---+
答案2
如果您的文件非常大,请查看 Power Query。我个人目前不具备按特定顺序重新排列列的技能,尽管我可以按字母顺序重新排列它们……我想)。所以我不会在这里谈论如何实现它,至少今天不会。
它可以做一些令人惊奇的事情(对于习惯于 Excel 限制的人来说,这很令人惊奇,而且在 VBA 方面经验不足,无法完成一些稍微复杂的事情)。据我所知,它绝对可以胜任这项工作,尽管我不认为我会很快完成它。
然而,如果文件大小不是很大,非常简单的公式方法可以完成工作而不会让您的计算机停止运行,或者至少不会让 Excel 停止运行,那么以下确实是一种非常简单的方法。
我不知道您使用的文件是否必须像现在一样继续存在,或者是否可以修改它们。如果必须保持原样,请创建一个子目录并将所有文件复制到该子目录中。如果可以更改它们,那就容易多了,因为不需要复制文件,但如果文件将继续使用,并且只需重新排列列不会造成任何问题,那么更改它们以便将来不再需要更改会更好。正如他们所说,“一劳永逸”。
要重新排序列而不需要做任何工作,只需使用以下公式:
=INDEX($I$1:$O$4,SEQUENCE(ROWS($I$1:$O$4)),MATCH($A$1:$G$1,$I$1:$O$1,0))
(对于公式,我在 A:G 中放置了一个 6 列 4 行的表格,然后在 I:O 中放置了另一个具有相同标题的表格,但它们相对于 A:G 表格是混合顺序的。)
INDEX()
给出了您希望重新排序的表,在本例中为 I1:O4。为了告诉它使用所有行,我们使用SEQUENCE()
一个参数(因为“行”或输出是它的第一个参数,我们不需要更多)。该参数是您需要重新排序的表中的行数。使用序列可以让您像我一样为其提供范围地址,命名范围(真正为什么要这样使用它),或者只是行数。毕竟,大多数表格你只要知道范围的右侧就可以了,对吧?或者可能只是减去其上方行的某个值。只有使用命名范围,你才真正需要做任何事情,而不仅仅是说“嗯... I1:O4... 里面一定有 4 行,所以我只需输入 4...”。
最后一部分是好的部分:列的排序。INDEX()
允许您重新排列列和/或让它们出现多次。如果您知道所有文件所需的顺序,您可能只需输入类似的东西{4,2,19,7,...}
来告诉它,但您不知道。它们可以是任何顺序,并且每个顺序都不同。
但是如果您使用MATCH()
,您可以让 Excel 为您完成所有不同顺序的工作。您告诉MATCH()
使用一个文件的标题,无论哪个文件,都没关系,但您将该文件的标题顺序用于您打开和重新排列的所有文件。因此 match 会在当前文件的标题中查找它们中的每一个,并将找到的顺序反馈给它,INDEX()
然后按照与您选择作为顺序源的文件相同的标题顺序重新组装您的数据。
甚至更好的是,该公式生成一个二维 SPILL 数组,因此将公式复制到单个单元格将生成整个输出表。
由于您将在工作完成后可以保存的文件中执行此操作(无论是复制集还是原始文件,无论如何您都将使用可以更改和保存的文件),因此接下来您需要选择整个输出,然后复制并只保留Paste|Special|Values
数据,而不是公式输出。然后删除原始材料,只留下输出表。保存。继续下一个。
如果您打算在原件上执行此操作,并且它们将进一步使用,那么一个巧妙的方法是选择原始表格并进行复制,然后Paste|Special|Formats
在输出表格上保留表格格式。甚至可以Paste|Special|Column widths
保持相同的外观和感觉。
我想你不需要列宽,因为你似乎打算将 CSV 文件合并在一起……几乎所有的格式都无关紧要。不过,如果你确实使用实时文件并且确实希望将来使用它们,请在删除原始表格之前执行格式化步骤。另存为 Excel 文件,然后保存为 CSV 副本。我猜也许它们已经是 CSV 文件了,所以不用担心,但请记住这一点,以便将该方法用于其他用途。
无论如何,打开列表中的第一个文件,将此公式复制到其中并根据需要调整地址,然后复制公式单元格,打开列表中的第二个文件并粘贴。执行上述操作将其更改为数据,删除旧文件,然后以相同的 CSV 格式保存。重复此操作,直到所有文件都已修复。然后将它们连接起来。
更好的是,如果您对 VBA 足够熟悉,请打开一个新文件,命名并保存它(作为宏文件,即 .xlsm),编写一个宏来分块浏览目录中的文件,向每个文件添加公式,将输出更改为仅数据,删除其左侧的所有内容,以便输出的第一个单元格为 A1,并将每个文件保存为 CSV。再次保存此新文件。然后将其推出并运行。