2017-07-05 4 views
0

J'essaie de convertir des données d'un fichier CSV chargé en une table Azure, mais je rencontre des problèmes lorsque l'une des valeurs est chargée dans une chaîne et l'équivalent La valeur dans la table est décimale.Conversion décimale en chaîne pour comparaison dans U-SQL

@ProdOutput = 
    EXTRACT 
    [p_description] string, 
    [p_code] string, 
    [p_price] string, 
    [p_colour] string 
FROM "testing/martin/items.csv" 
USING Extractors.Csv(skipFirstNRows:1); 


// @items has been brought in from a table in Data Lake Analytics 
@holdings_query = 
    SELECT ROW_NUMBER() OVER (ORDER BY h.code) AS rn, 
     h.description AS Description, 
     h.cd AS Code,  
     h.priceGBP AS Price,  
     h.col AS Colour 
FROM @items AS h; 



@result = 
    SELECT 
    p_description == Description ? p_description : String.Concat("Mismatch", p_description, " !! ", Description) AS [Desc], 
    p_code == Code ? p_description : String.Concat("Mismatch", p_code, " !! ", Code) AS [Code], 
    p_price == Price ? p_price: String.Concat("Mismatch", p_price, " !! ", Price) AS [Price] 
FROM @holdings_query AS h 
LEFT OUTER JOIN @prod_data AS p ON h.Code == p.p_code; 

Le problème est que je veux la déclaration EXTRACT pour apporter tout génériquement comme une chaîne, comme je vais pas toujours de connaître le type de chacune des colonnes. Donc, quand je fais la comparaison dans la déclaration finale, je voudrais convertir le prix de décimal (comme il est dans le tableau) en chaîne pour comparer avec ce qui sort de la CSV.

J'ai essayé ToString(), ToString ("G"), (chaîne?), Mais ils provoquent tous des erreurs. Qu'est-ce que je fais mal?

TIA Martin

données Exemple:
Items.csv:
"Item1", "IT1", "3,65"
"Item2", "IT2", "4.00"
« Item3 », "IT3", "524,2123"

table @items:
"Item1", "IT1", 3,65
"Item2", "IT2", 4,00
"Item3", "IT3", 524.2123

+0

Pouvez-vous fournir quelques exemples de données s'il vous plaît? – wBob

Répondre

1

Essayez Decimal.Parse sur le type string. Cette méthode "... convertit la représentation sous forme de chaîne d'un nombre en son équivalent décimal". J'ai la déclaration suivante au travail, où p_price est la valeur de chaîne:

@result = 
    SELECT 
      Decimal.Parse(p.p_price) == h.Price ? 1 : 0 AS isEqual 
... 
+0

J'ai essayé ce que vous avez dit, mais j'ai reçu ce qui suit: Description Le compilateur C# a signalé que cette expression n'est pas C# valide. Résolution Assurez-vous qu'une expression C# valide est spécifiée. Détails à jeton 'h', ligne 237 près du ###: ************** ### h. [Price] == Decimal.Parse (p. [ p_Price])? h. [Price]: String.Concat ("Mismatch", h. [Prix], "!!", p. [p_Price]) AS [Prix] Erreur E_CSC_USER_INVALIDCSHARP Message Erreur C# CS0173: Type d'expression conditionnelle ne peut pas être déterminé car il n'y a pas de conversion implicite entre «décimal» et 'string' – martin

+0

En outre, le problème avec ceci est que je devrais savoir quand la valeur est décimale pour le convertir. Donc, y a-t-il un moyen de dire SI TYPE EST DECIMAL, puis faire une conversion et une comparaison décimales, sinon faire une comparaison de chaînes? – martin

+1

Restez simple et essayez d'obtenir l'expression que je vous ai donnée. L'opérateur conditionnel doit retourner le même type de données, donc je pense que c'est la raison pour laquelle vous obtenez cette erreur. Le [GetTypeCode] (https://msdn.microsoft.com/en-us/library/azure/mt621341.aspx#GetTypeCode) renvoie le typeCode pour une chaîne doit donc être en mesure de faire ce dont vous avez besoin. – wBob