2017-06-22 16 views
0

我有一個電子表格/ CSV:重塑數據集成多個關係格式(轉置一些行,並將它們分配到數據子集)

Code:,101,Course Description:,"Introduction to Rocket Science", 
Student Name,Lecture Hours,Labs Hours,Test Score,Status 
John Galt,48,120,4.7,Passed 
James Taggart,50,120,4.9,Passed 
... 

我需要將其重塑以下觀點:

Code:,Course Description:,Students,Lecture Hours,Labs Hours,Average Test Score,Teaching Staff 
101,"Introduction to Rocket Science",John Galt,48,120,4.7,Passed 
101,"Introduction to Rocket Science",James Taggart,50,120,4.9,Passed 
... 

無論它與否,不能得到正確的想法儘管它似乎是非常原始的變換,有沒有什麼銀彈? (csv)有一種類似於json的結構,所以我的第一種方法是將原始數據表示爲一個向量,然後將它轉置爲,(但在這種情況下,我的結果表看起來像sparced矩陣 - 我已經轉換的行在它的其餘值中是空的) 另一種方式I m considering - **serialize it into jsons and then de-serialize** into new spreadsheet (jsonize()) - in this case, I m在正確合併它們時存在問題。

在這兩種方式,我有它「半工作」; 任何人都可以爲此提出簡單可靠的算法; 任何語言,正則表達式,任何工具,代碼片斷非常讚賞

+0

你重塑CSV是怪異:第一行七列和第二隻六隻。 –

+0

結果數據集中的所有行都有7列; – Maxim

+0

在源數據集中,有兩個屬性必須作爲結果數據集中的列添加(代碼和課程描述)。所以在源代碼中有5個列,在結果列中有7個列。 – Maxim

回答

1

假設你已經在這裏描述的模式始終是一致的,也有相當你可以採取我認爲幾個不同的方法,但在所有情況下,你基本上可以使用「課程」行以「代碼:」開頭的事實,但這永遠不會是學生的名字。

您可以通過正則表達式查找/替換或在OpenRefine中利用此功能。

例子:

    在支持 發現正則表達式文本編輯器
  1. 打開文件/替換
  2. 開頭爲搜索「代碼:」並添加額外的逗號行的開始例如,將課程數據列移動到 搜索:^代碼:替換爲:,,,,, ^代碼:
  3. 如果您現在將文件導入到OpenRefine中,那麼您將有一個包含10列的項目(第10列是由尾隨 逗號課程數據行的末尾)
  4. 現在,您可以在包含過程中數據最右邊的列使用移調(或只是重命名),同時保留其包含的學生詳細介紹
  5. 隔離最左邊的 列在第一列中包含短語「學生名稱」的行並將其刪除(通過過濾器或方面)
  6. 將課程代碼/說明列移動到項目的開頭,然後使用「編輯單元格 - > Fil l倒」的每一列選項來獲取值重複上的所有相關線路
  7. 最後,只要你想重命名列,刪除任何無關列
+0

非常好,非常感謝,歐文。簡單地移動2個「壞」列,轉置它們並填滿。你認爲在vim/emacs中只用正則表達式就可以完成所有這些步驟嗎? – Maxim

+0

可能!例如在vim中:1,$ s/^代碼:/ ,,,,,/g然後:g/^學生名稱/ d。不知道'填補'步驟 - 我認爲在OpenRefine中絕對更容易。 sed也可能做這項工作 –