2017-03-08 22 views
0

我開發使用Unity hololens一個應用程序中,我從一個API下載一個CSV,然後分析它等我發現,你不能使用WebClient類來下載CSV和StreamReader類來解析CSV,如果您正在構建Windows應用商店應用程序(WSA)。我已經能夠使用受支持的WWW類替換WebClient。我想使用此代碼複製我在StreamReader的在做,但它不工作這麼好:Web客戶端和StreamReader類在構建Windows應用商店 - 生成錯誤在Unity

var Folder =  Windows.ApplicationModel.Package.Current.InstalledLocation; 
var sp500 = @"..\Hololens\Assets\FinanceData\MarketTickers\"; 
Folder = await Folder.GetFolderAsync(sp500); 

// acquire file 
var _File = await Folder.GetFileAsync("sp500.csv"); 

// read content 
var _ReadThis = await Windows.Storage.FileIO.ReadTextAsync(_File); 

下面是完整的代碼。我回顧了依賴於平臺的編譯頁面(https://docs.unity3d.com/Manual/PlatformDependentCompilation.html),並添加了預處理器指令,以便我還可以統一運行腳本(在編輯器中),因爲支持WebClient和StreamReader並且在Unity編輯器中工作良好。有什麼建議麼?

#if !UNITY_WSA_10_0 
     using (var reader = new StreamReader(file)) 
     { 
      while (!reader.EndOfStream) 
      { 
       var csvLine = reader.ReadLine(); 
       var firstCommaIndex = csvLine.IndexOf(","); 
       var stock = csvLine.Substring(0, firstCommaIndex); 

       // In case there are symbols in the stock names that would not be recognized by Yahoo API 
       if (!tickers.Contains(stock) && !stock.Contains('/')) 
       { 
        tickers.Add(stock); 
       } 
      } 
     } 
#else 
     var Folder =  Windows.ApplicationModel.Package.Current.InstalledLocation; 
     var sp500 = @"..\Hololens\Assets\FinanceData\MarketTickers\"; 
     Folder = await Folder.GetFolderAsync(sp500); 

     // acquire file 
     var _File = await Folder.GetFileAsync("sp500.csv"); 

     // read content 
     var _ReadThis = await Windows.Storage.FileIO.ReadTextAsync(_File); 
#endif 

建設WSA通用10 SDK時,我得到的錯誤:

Assets/Scripts/FinanceFunctions.cs(59,33): error CS1525: Unexpected symbol `Folder' 
Assets/Scripts/FinanceFunctions.cs(65,41): error CS1525: Unexpected symbol `Windows' 
Assets\Scripts\FinanceFunctions.cs(65,29): error CS4032: The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task<string>'. 
+0

他們沒有將UWP 10中的「Folder」更名爲「StorageFolder」嗎?我認爲您的方法調用對於當前的UWP SDK是貶值的。 – Smartis

+0

如果你想在prj中獲得你可以使用AppData.Current.LoacalFolder的文件,並且你不應該使用'sp500'作爲url來獲取文件。 – lindexi

+1

即使您編譯此代碼,也無法在安裝位置之外讀取('「.. \」'試圖從您的目錄結構中退出)。如果你想使用'await',你也需要'async'方法 - 這不是整個代碼示例。 –

回答

0

如果我理解正確你想要的東西,是下載.csv文件,並對其進行分析,而無需使用Web客戶端或StreamReader的。

爲了解析我會用這樣的CSVReader

,代碼會是這樣的一個MonoBehaviour的StartCoroutine(稱呼):

public IEnumerator GetCSVCoroutine(System.Action<string[,]> OnFinished) 
{ 
    var downloader = new WWW("csvurl.com/csvfile.csv"); 
    yield return downloader; 
    var fileText = downloader.text; 
    string[,] csvGrid = CSVReader.SplitCsvGrid(fileText); 
    OnFinished(csvGrid); 
} 

此外,而不是WWW的,你也可以使用UnityWebRequest

我希望這對你有用。

0

如果你想使用StreamReader Unity3D讓你有機會使用WinRTLegacy命名空間。這應該包含System.IO.StreamReader的傳統版本。

實現一個最好的辦法是在你使用部分

#if NETFX_CORE 
using StreamReader = WinRTLegacy.IO.StreamReader; 
#else 
using StreamReader = System.IO.StreamReader; 
#endif 

然後,您可以繼續使用它,你總是有添加此。

#if NETFX_CORE是絕對必要的,因爲在編輯器中當前沒有基於.NET Core的命名空間可用。 這是令人討厭的,因爲您只能在構建時測試代碼,因爲這是實際的.NET Core API涉及的唯一階段。編輯: 我剛剛意識到你有一個完全不同的問題。 下面是您正確的解決方案:

#if NETFX_CORE 
     public static string ReadFile(string filename) 
     { 
      var task = LoadFileAsync(filename); 

      Task.WaitAll(task); 

      return task.Result; 
     } 

     private static async Task<string> LoadFileAsync(string filename) 
     { 
      StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename); 

      return await FileIO.ReadTextAsync(file); 
     } 
#endif 

請注意,您不能在編輯器中使用此功能,因爲一些命名空間,如Windows e。使用.NET核心庫編譯時await關鍵字是唯一可用的,這是目前在Unity編輯器環境中不可用。

根據您是在UWP版本還是其他任何環境下,使用不同的實現可能會更好。

相關問題