Filtrer une colonne dans une boucle DATA d'un fichier CSV

Bonjour,

Je butte sur la boucle DATA d’un fichier CSV en souhaitant filtrer sur une colonne. Plusieurs tentatives de syntaxe mais toujours en échec, dont celle-ci qui me semblait la plus propre pour filtrer la colonne 11 sur la valeur « 45 » :
<BOUCLE_cnam(DATA){source csv,#GET{source}} {/11 = 45} {cle>0} {« , »}>

Merci de vos idées !

Mais alors, quel est le résultat et le problème avec la boucle que tu cites ?

Les résultats erronés et les messages d’erreurs sont autant d’indices pour comprendre et résoudre un problème. Il faut donc les partager en demandant de l’aide.

Si ce n’est pas une erreur de syntaxe, tu pourrais essayer avec {/10=45} car dans Les itérateurs de SPIP - la boucle (DATA) - SPIP, l’exemple utilise {par /0} ce qui semble indiquer que la numérotation commence à 0 comme en PHP.

Merci JLuc de ton retour,

{/10=45} ne marche pas mieux (et effectivement la colonne 11 doit bien correspondre à /10).

Rien d’anormal dans les logs. Le mode débug semble bien accepter le filtre {/10=45}.
BOUCLE DATA {source csv,#GET{source}}{/10=45}{cle>0}{par /10,/1,/2,/3,/4,/20} Mais ça ne sélectionne rien (aucune ligne) alors que {/10!=45} sélectionne tout (yc le code 45) !

Debug > Code :
`
/* BOUCLE DATA {source csv,#GET{source}}{/10=45}{cle>0}{par /10,/1,/2,/3,/4,/20} */

function BOUCLE_sourcehtml_da30f10d77b71c188b4560640fefde90(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {

static $command = array();
static $connect;
$command['connect'] = $connect = '';
$command['sourcemode'] = 

// 3 signes
‹ csv ›;

$command['source'] = array(

// #GET
retablir_echappements_modeles(table_valeur($Pile[« vars »]??, (string)
// 6 signes
‹ source ›, null)));

if (!isset($command['table'])) {
    $command['table'] = '';
    $command['id'] = '_source';
    $command['from'] = array();
    $command['type'] = array();
    $command['groupby'] = array();
    $command['select'] = array(".valeur");
    $command['orderby'] = array('/10', '/1', '/2', '/3', '/4', '/20');
    $command['where'] = 
        array(
        array('=', '/10', 

// 2 signes
« 45 »),
array(‹ > ›, ‹ cle ›,
// 1 signes
« ‹ 0 › »));
$command[‹ join ›] = array();
$command[‹ limit ›] = ‹  ›;
$command[‹ having ›] =
array();
}
if (defined(« _BOUCLE_PROFILER »)) $timer = time()+(float)microtime();
$t0 = «  »;
// REQUETE
$iter = Spip\Compilateur\Iterateur\Factory::create(
« DATA »,
$command,
array(‹ plugins/cnam/modeles/cnam.html ›,‹ html_da30f10d77b71c188b4560640fefde90 ›,‹ _source ›,4,$GLOBALS[‹ spip_lang ›])
);
if (!$iter->err()) {
$SP++;
// RESULTATS
while ($Pile[$SP]=$iter->fetch()) {

    $t0 .= (

// 3 signes

’ .

// #SET
retablir_echappements_modeles(vide($Pile[‹ vars ›][$_zzz=(string)
// 4 signes
‹ cnam ›] =
// #GET
(filtre_push(table_valeur($Pile[« vars »]??, (string)
// 4 signes
‹ cnam ›, null),
// #VALEUR
(interdire_scripts(safehtml($Pile[$SP][‹ valeur ›]))))))) .

// #VALEUR
retablir_echappements_modeles(interdire_scripts(safehtml(table_valeur($Pile[$SP][‹ valeur ›],
// 2 signes
‹ 10 ›)))) .

// 6 signes
'

');
}
$iter->free();
}
if (defined(« _BOUCLE_PROFILER »)
AND 1000*($timer = (time()+(float)microtime())-$timer) > _BOUCLE_PROFILER)
spip_log(intval(1000*$timer).« ms BOUCLE_source @ plugins/cnam/modeles/cnam.html »,« profiler »._LOG_AVERTISSEMENT);
return $t0;
}`

La solution de contournement serait de tester la suite de mon code par [(#VALEUR{10}={45}|oui) code...] mais c’est dommage.

Merci encore, mais si quelqu’un a la solution, ça m’intéresse ! :slight_smile:

Ce serait bien de trouver… mais vu que le filtrage a lieu après=indépendamment de la sélection avec les boucles DATA, il se peut que ta solution n’induise pas de pénalité significative.