2016-12-20 1 views
0

J'ai grand nombre de lignes sur un fichier csv, qui ressemblent à:concaténer les lignes en fonction du nombre (Google Refine, feuille de calcul Excel/Google)

name a,1 
name b,1 
name c,1 
name d,2 
name e,2 

Je dois concaténer les lignes en fonction du nombre. Le résultat devrait être:

name a|name b|name c 
name d|name e 

Comment puis-je le faire dans Google Refine ou dans Excel/Google Spreadsheet? Je pense à cela, mais sans solution.

Merci beaucoup!

+0

Est vous êtes sûr que ce sont vos deux seules options? Ce serait comme 10 lignes en Python. – arkottke

+0

S'il vous plaît pouvez-vous me montrer comment le résoudre en python. Merci – armando85

Répondre

0

Voici une proposition avec Open affine. La seule formule Grel i utilisé est:

row.record.cells['myColumn'].value.join('|') 

screencast

Et voici le JSON, en supposant que votre première colonne est nommée "mycolumn" et le second "numéro":

[ 
    { 
    "op": "core/column-addition", 
    "description": "Create column test at index 2 based on column number using expression grel:value", 
    "engineConfig": { 
     "mode": "row-based", 
     "facets": [ 
     { 
      "omitError": false, 
      "expression": "isBlank(value)", 
      "selectBlank": false, 
      "selection": [ 
      { 
       "v": { 
       "v": false, 
       "l": "false" 
       } 
      } 
      ], 
      "selectError": false, 
      "invert": false, 
      "name": "ee", 
      "omitBlank": false, 
      "type": "list", 
      "columnName": "ee" 
     } 
     ] 
    }, 
    "newColumnName": "test", 
    "columnInsertIndex": 2, 
    "baseColumnName": "number", 
    "expression": "grel:value", 
    "onError": "set-to-blank" 
    }, 
    { 
    "op": "core/column-move", 
    "description": "Move column test to position 0", 
    "columnName": "test", 
    "index": 0 
    }, 
    { 
    "op": "core/blank-down", 
    "description": "Blank down cells in column test", 
    "engineConfig": { 
     "mode": "row-based", 
     "facets": [ 
     { 
      "omitError": false, 
      "expression": "isBlank(value)", 
      "selectBlank": false, 
      "selection": [ 
      { 
       "v": { 
       "v": false, 
       "l": "false" 
       } 
      } 
      ], 
      "selectError": false, 
      "invert": false, 
      "name": "ee", 
      "omitBlank": false, 
      "type": "list", 
      "columnName": "ee" 
     } 
     ] 
    }, 
    "columnName": "test" 
    }, 
    { 
    "op": "core/column-addition", 
    "description": "Create column concatenation at index 2 based on column myColumn using expression grel:row.record.cells['myColumn'].value.join('|')", 
    "engineConfig": { 
     "mode": "row-based", 
     "facets": [ 
     { 
      "omitError": false, 
      "expression": "isBlank(value)", 
      "selectBlank": false, 
      "selection": [ 
      { 
       "v": { 
       "v": false, 
       "l": "false" 
       } 
      } 
      ], 
      "selectError": false, 
      "invert": false, 
      "name": "ee", 
      "omitBlank": false, 
      "type": "list", 
      "columnName": "ee" 
     } 
     ] 
    }, 
    "newColumnName": "concatenation", 
    "columnInsertIndex": 2, 
    "baseColumnName": "myColumn", 
    "expression": "grel:row.record.cells['myColumn'].value.join('|')", 
    "onError": "set-to-blank" 
    } 
] 
+1

Merci beaucoup pour la réponse. J'espère apprendre de cet outil. En ce moment, cette réponse a été d'une grande aide – armando85

0

Si vous pouvez utiliser Python, il serait assez facile de faire cette manipulation. Dans le code ci-dessous, le nom et le groupe sont lus à partir de "input.csv", et les noms groupés (avec le groupe) sont écrits dans "output.csv". Un defaultdict est utilisé pour créer des listes vides pour stocker les membres du groupe.

import collections 
import csv 

grouped = collections.defaultdict(list) 
with open('input.csv') as fp: 
    reader = csv.reader(fp) 
    for row in reader: 
     name, group = row 
     grouped[group].append(name) 


with open('output.csv', 'w', newline='') as fp: 
    writer = csv.writer(fp, delimiter='|') 
    for key in sorted(grouped.keys()): 
     writer.writerow([key] + grouped[key])