我正在使用Unity为hololens开发一个应用程序,我从API下载CSV,然后解析它等。我发现你不能使用WebClient
类来下载CSV和{{1如果要构建Windows应用商店应用程序(WSA),则可以解析CSV。我已经能够使用支持的StreamReader
类替换WebClient。我正在尝试使用此代码来复制我在StreamReader中所做的事情,但它不能很好地工作:
WWW
这是完整的代码。我查看了平台相关的编译页面(https://docs.unity3d.com/Manual/PlatformDependentCompilation.html)并添加了预处理程序指令,这样我也可以在Unity中运行脚本(在编辑器中),因为支持WebClient和StreamReader并在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);
构建WSA Universal 10 SDK时遇到的错误:
#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
答案 0 :(得分:0)
如果我理解正确,你想要的是下载一个.csv并解析它而不使用WebClient或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);
}
此外,您还可以使用UnityWebRequest
代替WWW我希望这对你有用。
答案 1 :(得分: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
和await
关键字仅在使用.NET Core库编译时才可用,该库目前在Unity中不可用编辑环境。
根据您是在UWP构建还是在任何其他环境中,让相同的函数使用不同的实现可能会更好。