Unity C#读取CSV到锯齿数组时for循环输出异常求助
首先,我注意到你遇到了一个有点矛盾的现象:直接通过索引打印每行长度完全正常,但for循环却只输出第一行的结果,后续循环迭代既没有输出也不报错。结合你的代码和描述,我整理了几个最可能的原因及对应的解决办法:
1. Unity Console输出被折叠或过滤
这是最容易被忽略的小细节:Unity的Console默认会折叠内容相同的日志。如果你的三行数据长度都是5,那么Debug.Log(data[i].Length)的输出都是5,Console可能会把后两个5折叠到第一个日志条目下面,你需要点击日志左侧的小三角展开查看所有输出。
另外,检查Console的过滤选项,确保没有勾选"Error only"或者其他过滤条件,导致Info级别的日志被隐藏。
2. 代码执行上下文不一致
你提到的"直接打印"和for循环代码会不会不在同一个代码块/方法里?比如:
- 读取数据并直接打印的代码在
Awake()里执行 - 而
for循环的代码在另一个方法(比如Update())里,但此时data变量已经被修改或者超出作用域了?
如果是这种情况,确保data是类的成员变量(而非局部变量),这样在不同方法里都能访问到正确的数组。
3. CSV文件的换行符异常
虽然你的直接打印显示数组有3个元素,但如果CSV文件使用了非标准换行符(比如某些系统下的\r而非\r\n),可能会导致StreamReader.ReadLine()读取时出现隐形问题。建议你修改读取代码,使用更健壮的方式处理CSV,同时用using语句确保资源被正确释放:
// 用using包裹StreamReader,自动释放文件资源 using (StreamReader test = new StreamReader("D:/Unity/Projects/.../Assets/Resurces/test.csv")) { var testLines = new List<string[]>(); while (!test.EndOfStream) { string line = test.ReadLine(); // 跳过空行,避免无效数据干扰 if (!string.IsNullOrWhiteSpace(line)) { string[] columns = line.Split(','); testLines.Add(columns); } } var data = testLines.ToArray(); // 在这里直接执行循环测试,确保上下文一致 Debug.Log("数组总行数:" + data.Length); for (int i = 0; i < data.Length; i++) { Debug.Log($"第{i}行长度:{data[i].Length}"); } }
4. 隐形的代码逻辑干扰
检查读取数据和循环之间的代码,有没有可能无意中修改了data数组?比如:
// 错误示例:不小心重新赋值了data,导致数组长度变为1 data = new string[1][] { data[0] };
这种操作会让data.Length变成1,导致循环只执行一次,但如果你是在赋值前完成的直接索引打印,就会出现"直接打印正确但循环异常"的矛盾现象。
按照上面的思路排查,应该能快速找到问题所在。另外,推荐你用更简洁的方式读取CSV,比如利用File.ReadAllLines()简化代码:
string[] allLines = File.ReadAllLines("D:/Unity/Projects/.../Assets/Resurces/test.csv"); var data = allLines.Where(line => !string.IsNullOrWhiteSpace(line)) .Select(line => line.Split(',')) .ToArray();
内容的提问来源于stack exchange,提问作者Márk Burka

