2017-09-26 4 views
1

J'ai une assemblée qui retourne uneUSQL Tableau de tableau au format CSV plat

SQL.ARRAY<SQL.ARRAY<string>> 

je dois aplatir à un csv, ne pas obtenir le bon résultat.

Voici à quoi il ressemble dans U-SQL, si je crée le tableau de tableaux en ce que:

DECLARE @boardA1 SQL.ARRAY<string> = new SQL.ARRAY<string>{"111", "PASS", "0"}; 
DECLARE @boardA2 SQL.ARRAY<string> = new SQL.ARRAY<string>{"222", "PASS", "0"}; 
DECLARE @boardA3 SQL.ARRAY<string> = new SQL.ARRAY<string>{"333", "PASS", "0"}; 

@boards = 
    SELECT * 
    FROM(
     VALUES 
     (
      new SQL.ARRAY<SQL.ARRAY<string>>{@boardA1, @boardA2, @boardA3} 
     ) 
      ) AS t(boards); 

@result = 
    SELECT n.value AS Board 
    FROM @boards 
     CROSS APPLY 
      EXPLODE(boards) AS c(value) 
     CROSS APPLY 
      EXPLODE(c.value) AS n(value); 


OUTPUT @result 
TO "result1.csv" 
USING Outputters.Csv(); 

Je reçois cette sortie:

"111" 
"PASS" 
"0" 
"222" 
"PASS" 
"0" 
"333" 
"PASS" 
"0" 

mais je veux cette sortie:

"111","PASS","0" 
"222","PASS","0" 
"333","PASS","0" 

Qu'est-ce que je fais mal? Toute contribution appréciée!

+0

Juste une observation sur les données de test, chaque "colonne" du tableau est la même structure suggérant qu'il devrait être une ligne. Est-ce juste un artefact de vos données d'échantillon? – wBob

Répondre

1

@result2 = SELECT "\"" + string.Join(",", c.board).Replace(",", "\",\"") + "\"" AS Boards FROM @boards CROSS APPLY EXPLODE(boards) AS c(board);

OUTPUT @result2 TO "result2.csv" USING Outputters.Csv(quoting: false);

Voir les exemples sous ARRAY<ARRAY<string>> de Explode (U-SQL)

+0

J'ai essayé cela plus tôt, mais cela fait une chaîne avec des valeurs séparées par des virgules, et non des chaînes séparées par des virgules. Il a fait ce "111, PASS, 0" au lieu de ce "111", "PASS", "0" – Anders

0

Je le faire en utilisant l'ordinal du tableau que vous voulez, par exemple

@result = 
    SELECT 
     x.board[0] AS a, 
     x.board[1] AS b, 
     x.board[2] AS c   
    FROM @boards 
     CROSS APPLY 
      EXPLODE(boards) AS x(board); 

Avec cette approche, vous pouvez spécifiez les noms de colonne explicitement et quoting se comporte comme exp ect. L'inconvénient de cette approche est que vous devez savoir combien de "colonnes" il y a dans le tableau.