Bonjour à tous,

j'ai un webservice qui me crache des données sous cette forme:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
"JAHR";"PERIODE";"VERSION";"EINHEIT";"PARTNER";"KATEGORIE";"GUV-KZ";"AUFTRAG";"BELEGNR";"BELEGART";"SATZNUMMER EINZELPOSTENSATZ";"LEDGER";"SATZART";"BUCHUNGSKREIS";"HERKUNFTSOBJEKT";"VORGANG";"EMPFAENGER OBJEKTART";"REFERENZBELEGNUMMER";"BUCHUNGSTEXT";"DEBITOR";"DEBITORNAME";"KREDITOR";"KREDITORNAME";"BETRAG IN EUR";"#VALUE"\r\n
"2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194.25";"-0.19425"
avec souvent beaucoup plus de lignes (et le nombre de colonnes peut être variable)

mon but ce serait d'effectuer un traitement dans la seconde ligne sur les 2 dernières colonnes (entre autres remplacer le "." par une ",") ; en sortie j'ai besoin d'exactement du même format (avec les guillemets et les points virgules), c'est à dire:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
"JAHR";"PERIODE";"VERSION";"EINHEIT";"PARTNER";"KATEGORIE";"GUV-KZ";"AUFTRAG";"BELEGNR";"BELEGART";"SATZNUMMER EINZELPOSTENSATZ";"LEDGER";"SATZART";"BUCHUNGSKREIS";"HERKUNFTSOBJEKT";"VORGANG";"EMPFAENGER OBJEKTART";"REFERENZBELEGNUMMER";"BUCHUNGSTEXT";"DEBITOR";"DEBITORNAME";"KREDITOR";"KREDITORNAME";"BETRAG IN EUR";"#VALUE"\r\n
"2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194,25";"-0,19425"
j'ai essayé plusieurs méthodes:

1/ avec str_csv :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$mystring='"JAHR";"PERIODE";"VERSION";"EINHEIT";"PARTNER";"KATEGORIE";"GUV-KZ";"AUFTRAG";"BELEGNR";"BELEGART";"SATZNUMMER EINZELPOSTENSATZ";"LEDGER";"SATZART";"BUCHUNGSKREIS";"HERKUNFTSOBJEKT";"VORGANG";"EMPFAENGER OBJEKTART";"REFERENZBELEGNUMMER";"BUCHUNGSTEXT";"DEBITOR";"DEBITORNAME";"KREDITOR";"KREDITORNAME";"BETRAG IN EUR";"#VALUE"' . "\r\n";
$mystring.='"2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194.25";"-0.19425"';
 
$array1=str_getcsv($mystring,"\r\n");
 
$array2=array_map(function ($theArray)
{
	$theArrayCsvToArray=str_getcsv($theArray,';','"');
 
	$theValue1=$theArrayCsvToArray[count($theArrayCsvToArray)-1];
	$theValue1=str_replace('.',',',$theValue1);
	$theValue1=(strpos($orig,'E'))?substr($theValue1,0,strpos($theValue1,'E')):$theValue1;
 
	$theValue2=$theArrayCsvToArray[count($theArrayCsvToArray)-2];
	$theValue2=str_replace('.',',',$theValue2);
	$theValue2=(strpos($orig,'E'))?substr($theValue2,0,strpos($theValue2,'E')):$theValue2;
 
	$theArrayCsvToArray[count($theArrayCsvToArray)-1]=$theValue1;
	$theArrayCsvToArray[count($theArrayCsvToArray)-2]=$theValue2;
	return $theArrayCsvToArray;
}
,$array1);
 
print_r($array2);
ça fonctionne mais il faut que je remette les guillemets et que je reimplose 2 fois, 1 pour les ";" et l'autre pour les \r\n. or pour des raisons de performances je souhaiterais me passer d'une ou deux itérations supplémentaire sur le tableau

2/ en recherchant la position de chaque "\r\n" pour ensuite remonter aux 2 dernières colonnes mais ca n'est pas très pratique...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$mystring='"JAHR";"PERIODE";"VERSION";"EINHEIT";"PARTNER";"KATEGORIE";"GUV-KZ";"AUFTRAG";"BELEGNR";"BELEGART";"SATZNUMMER EINZELPOSTENSATZ";"LEDGER";"SATZART";"BUCHUNGSKREIS";"HERKUNFTSOBJEKT";"VORGANG";"EMPFAENGER OBJEKTART";"REFERENZBELEGNUMMER";"BUCHUNGSTEXT";"DEBITOR";"DEBITORNAME";"KREDITOR";"KREDITORNAME";"BETRAG IN EUR";"#VALUE"' . "\r\n";
$mystring.='"2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194.25";"-0.19425"' . "\r\n";
$mystring.='"2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194.25";"-0.19425"';
 
$needle = "\r\n";
$lastPos = 0;
$positions = array();
 
while (($lastPos = strpos($mystring, $needle, $lastPos))!== false) {
    $positions[] = $lastPos;
    $lastPos = $lastPos + strlen($needle);
}
 
print_r($positions);
auriez vous une idée plus simple pour faire ça ?

D'avance merci !