我使用的是 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 列x 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。再次儲存這個新檔案。然後將其展開並讓它運行。