Additionner données .csv (Colonnes + Lignes)

Bonjour,

j'ouvre ce nouveau sujet en décortiquant mon problème.

J'utilise un script pour importer des données d'un .csv dont je dispose :

function importationCSV() {

  var id = "1TVo6i4s3J5aAHzoCKCNSed9XSeJ-8tGa"
  var id1= "0x00B591BC2b682a0B30dd72Bac9406BfA13e5d3cd"
  var id2= "0x083fc10cE7e97CaFBaE0fE332a9c4384c5f54E45"
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("csv");
  var result = []
  var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  var num1 = parseInt(id1)
  var num2 = parseInt(id2)
  for (var i = 0; i < csvData.length; i++) {
    if(parseInt(csvData[i][0])==num1 || parseInt(csvData[i][0])==num2 || csvData[i][0]=='Investor'){
      result.push(csvData[i]);
    }
  }
  feuille.getRange(1, 1, result.length, result[0].length).setValues(result)
}

Je vais mettre 2 photos pour montrer ce que je peux obtenir comme data.

image image

https://docs.google.com/spreadsheets/d/1jSJEMH16orgopMxkgIUWrrntngJnpc89Ya-Wjw8V4gg/edit?usp=sharing

1]Comment puis-je additionner les 2 lignes contenants les adresses ?

la première colonne contenant "investor" et les adresses peut sauter si il faut, j'en ai pas besoins spécialement

2] Est-ce possible d'additionner également les colonnes qui ont le même nom ?

Dans mes tests j'avais supprimé les "- TOTAL" ; " - CLAIM" ; etc... pour avoir seulement le nom de la propriété. mais ensuite j'ai pas assumé le regroupement de colonnes, ce n'est pas dans mes compétences

Voici la liste des champs pouvant être supprimés :

"- TOTAL"
"- CLAIM"
"- DEPOSIT"
"- REINVEST"
"Pool - CLAIM"
"Pool - DEPOSIT"
"Pool - REINVEST"
"Rmm"

Pour tout regrouper j'y arrive avec un Query simple mais version script "tout-en-un" c'est une autre paire de manches…. j'aimerai ne pas avoir 50 tableau sur mon spreadsheet !

Merci

Pour additionner je ne sais pas ce qui etait le mieux entre traiter les lignes ou les colonnes.

j'ai donc repris et adapté pour avoir un tableau et j'ai enlever les "en-têtes" également

à voir ce qui est le mieux

function lireCsvRentFromId(id) {

  var id = "1CVmdrk5bhlbEytoZlAh6msILJWQHQ9Yn"
  var id1Csv= "0x083fc10cE7e97CaFBaE0fE332a9c4384c5f54E45"
  var id2Csv= "0x00B591BC2b682a0B30dd72Bac9406BfA13e5d3cd"
  var feuilleCsv = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("csv");
  var cellformat = feuilleCsv.getRange('A1:C')
  var result = []
  var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  var num1 = parseInt(id1Csv)
  var num2 = parseInt(id2Csv)
  for (var i = 0; i < csvData.length; i++) {
    if(parseInt(csvData[i][0])==num1 || parseInt(csvData[i][0])==num2 || csvData[i][0]=='Investor'){
      if (csvData[i][0]=='Investor'){
        for (var ii=0;ii<csvData[i].length;ii++){
          csvData[i][ii]=csvData[i][ii].replace(" - TOTAL","").replace(" - DEPOSIT","").replace(" - REINVEST","").replace(" Rmm","").replace("OLD-","")
        }
      }
      result.push(csvData[i]);
    }
  }
  try{
    result = transpose(result)
    var newResult = []
    for (var i=0;i<result.length;i++){
      var flag = false
      for (var j=1;j<result[0].length;j++){
        if(result[i][j]!='' && result[i][j]!=0){
          flag = true
        }
      }
      if(flag){
        newResult.push(result[i])
      }
      var final = newResult.slice(1)
    }
    feuilleCsv.getRange(1, 1, final.length, final[0].length).setValues(final)
    cellformat.setNumberFormat('$0.000000')
  }catch(e){
  }
  SpreadsheetApp.flush();
}

function transpose(a){
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}
image

Bonjour,

j'ai trouvé un script que j'ai un peu adapté pour additionner les lignes !

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var input = ss.getSheetByName('Sheet1');
  var output = ss.getSheetByName('Sheet2');
  var inputValues = input.getDataRange().getValues();
  Logger.log(inputValues)
  for (var i = 1; i < inputValues.length; i++) {
    var properties = inputValues[i][0];
    var totalrents = [];
    for (var j = 0; j < inputValues.length; j++) {
      var rents = inputValues[j][1];
      if (properties == inputValues[j][0]) {
        totalrents.push(inputValues[j][1]);
      }
    }
    var outputValues = output.getDataRange().getValues();
    var newEntry = true;
    for (var k = 0; k < outputValues.length; k++) {
      if (properties == outputValues[k][0]) {
        newEntry = false;
      }
    }
    if (newEntry) {
      output.appendRow([properties,totalrents.reduce(function(a, b) {return a + b})]);
    }
  }
}
image image

Au tour de l'addition des 2 colonnes !

j'ai trouvé ceci :

function test() {

  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("colonnes");
  var rng = feuille.getRange("B1:C");
  var val = rng.getValues();
  for(row=0;row<val.length;row++) {
    val[row][0] = val[row][0]+val[row][1];
    val[row][1] ='';
  }
  rng.setValues(val)
}
image image

Maintenant je pense qu'il me faudrait un petit coup de main pour intégrer tout ça dans un seul script pour faire tout ces étapes en 1x si possible

pourquoi veux-tu le faire avec un script ? en TCD c'est immédiat !

J'ai un nouveau .CSV a traiter toute les semaines, avec potentiellement des nouvelles données / données differentes

et l'objectif final c'est de pouvoir reporter ces données dans un tableau "sauvegarde" pour avoir un visuel en fin d'année sur ce que X m'a rapporté chaque semaines

Comme ceci par ex.

image

Sachant que chaque semaines je peux avoir des nouvelles propriétés qui s'insert entre celles existante.

j'en ai pas parlé ici pour pas tout mélanger et faire comme la dernière fois…

C'est pour ça que l'objectif de ce sujet c'était de synthétiser au maximum le .CSV à importer. j'aurais fait un autre sujet ensuite pour l'enregistrement de ces données..

Mais je suis ouvert a toutes suggestions en effet.

pour la somme des lignes sur plusieurs colonnes, j'utilise ceci

function test() {
  var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getDataRange().getValues().slice(1)
  var result = sum2DmultiCol(data)
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2').getRange(1,1,result.length,result[0].length).setValues(result)
}
function sum2DmultiCol(a) {
  var s = [], m = new Map()
  a.forEach(function (r) {
    if (m.has(r[0])) {
      var p = m.get(r[0])
      r.forEach(function (v, c) { if (c > 0) { p[c - 1] += v } })
      m.set(r[0], p)
    }
    else {
      p = []
      r.forEach(function (v, c) { if (c > 0) { p.push(v) } })
      m.set(r[0], p)
    }
  })
  m.forEach(function (w, k) {
    p = []
    p.push(k)
    w.forEach(v => p.push(v))
    s.push(p)
  })
  return s.sort()
}

si tu veux que la valeur finale (somme par ligne) je regarde pour simplifier cela

pour la somme des lignes sur plusieurs colonnes, j'utilise ceci

Quelle différence avec celui que j'avais mis au dessus ? https://forum.excel-pratique.com/s/goto/1084755

si tu veux que la valeur finale (somme par ligne) je regarde pour simplifier cela

Avec les 2 scripts du dessus, j'ai réussi a additionner les 2 colonnes et additionner les lignes lorsque le nom est identique.

hier je n'ai pas vraiment eu le temps, mais je vais essayer d'assembler les 3 script = import csv + addition ligne + addition colonnes.

sinon je le ferais en plusieurs fois.

pour une somme lignes et colonnes

function test() {
  var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1')
    .getDataRange()
    .getValues().slice(1)
  var array = []
  data.forEach(r => {
    var sum = 0
    r.forEach((c, i) => {if (i > 0) { sum += c }})
    array.push([r[0], sum])
  })
  var result = sum2D(array)
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2').getRange(1, 1, result.length, result[0].length).setValues(result)
}
function sum2D(a) {
  var s = [], x = new Map()
  a.forEach(function (r) {
    if (x.has(r[0])) { x.set(r[0], (x.get(r[0]) + r[1])) }
    else { x.set(r[0], r[1]) }
  })
  x.forEach(function (value, key) { s.push([key, value]) })
  return s.sort()
}

pour la somme des lignes sur plusieurs colonnes, j'utilise ceci

Quelle différence avec celui que j'avais mis au dessus ? https://forum.excel-pratique.com/s/goto/1084755

il n'y a pas de différences en soi, j'ai juste repris une routine que j'avais écrite de façon générique et que j'utilise dans ces cas là, j'utilise les fonctions sum2D et sum2DmultiCol écrites une fois pour toutes

Merci Pour le script 2 en 1

Je viens de l'essayer et j'ai 2 petites erreurs qui se glissent dans mon tableau.

( à première vu le reste semble ok , je ferais d'autres tests avec d'autres .csv ensuite )

Sur le tableau récap:

image

Et voici ce qu'il y a dans le tableau "brut"

image

si jamais je remets le liens du .sheet

https://docs.google.com/spreadsheets/d/1jSJEMH16orgopMxkgIUWrrntngJnpc89Ya-Wjw8V4gg/edit?usp=sharing

à un moment donné il considère que les valeurs ne sont pas numériques

j'ai réussi à régler 581-587 Jefferson

reste le second

c'est ok pour les 2, je force les données en numérique

ligne 13

r.forEach((c, i) => {if (i > 0) { sum = +sum + c*1 }})

ligne 24

if (x.has(r[0])) { x.set(r[0], (+x.get(r[0]) + r[1]*1)) }

au lieu d'additionner il juxtaposait les valeurs

Merci !

je clôture ce sujet, je vais maintenant voir pour l'enregistrement de tout ça semaines après semaines

de mon côté, je vais essayer de mettre dans une seule et même fonction les sommes horizontales et verticales ... cela va me décoincer les neurones !

Rechercher des sujets similaires à "additionner donnees csv colonnes lignes"