读取 csv 并添加到 List<Custom class> 会给出不一致的空值
Posted
技术标签:
【中文标题】读取 csv 并添加到 List<Custom class> 会给出不一致的空值【英文标题】:Reading csv and adding to List<Custom class> gives inconsistent null values 【发布时间】:2021-08-04 07:45:19 【问题描述】:我正在尝试读取一个包含 5 列(int、str、int、str、str)的 csv 文件:
1234, wef23, 1, Mary, Smith
1234, wef23, 1, Mary, Smith
并将它们添加到列表中:
private List<PermittedUsers> okUsers = new List<PermittedUsers>();
PermittedUsers 已定义:
class PermittedUsers : MonoBehaviour
public int IdNum, part;
public string upi, firstName, lastName;
public PermittedUsers(int id, string up, int pt, string fname, string lname)
IdNum = id;
upi = up;
pt = part;
fname = firstName;
lname = lastName;
但是,在导入之后,firstName 和 lastName 都为 null,part 为默认的 0 值。但是,upi(作为字符串)和 IdNum(作为 int)都按预期添加到列表中。导入代码为:
// import 5 column csv: ID, UPI, yearLevel, First, Last
var dataset = Resources.Load<TextAsset>("permittedUsers"); // this is loading the file in Unity without System.IO
var dataLines = dataset.text.Split('\n');
for(int i = 1; i < dataLines.Length-1; i++) // skip header line and last empty line
var data = dataLines[i].Split(',');
okUsers.Add(new PermittedUsers(int.Parse(data[0]), data[1], int.Parse(data[2]), data[3], data[4].Replace("\r", string.Empty)));
调试和检查数据我可以看到它返回一个具有正确值的字符串[5](作为字符串)。
我对这里的不一致感到最困惑,为什么 upi 而不是 fname 会正确添加到列表中?为什么是IdNum,而不是pt?它发生在 CSV 中的 all 行中,所以我不认为这是由于特殊字符造成的。我还缺少什么?
【问题讨论】:
看起来像一个错字.. 构造函数中的字符串分配应该反过来.. ;) 无论哪种方式... 禁止在MonoBehaviour
上使用new
! 你确定它甚至应该是MonoBeuaviour
吗?
【参考方案1】:
当您调用构造函数时,您可能会留下未填充的 PermittedUsers
的某些属性。
class PermittedUsers : MonoBehaviour public int IdNum, part; public string upi, firstName, lastName; public PermittedUsers(int id, string up, int pt, string fname, string lname) IdNum = id; upi = up; pt = part; // possible flipped assignment fname = firstName; // possible flipped assignment lname = lastName; // possible flipped assignment
最明显
pt = part;
看起来应该是part = pt;
和
fname = firstName;
lname = lastName;
应该是
firstName = fname;
lastName = lname;
如果这是问题所在,避免这种情况的快速提示是始终在构造函数中使用 this
关键字。这有助于您作为开发人员看到属性(在您的情况下是字段)正在对象上正确设置,而不是相反。例如:
class PermittedUsers : MonoBehaviour
public int IdNum, part;
public string upi, firstName, lastName;
public PermittedUsers(int id, string up, int pt, string fname, string lname)
this.IdNum = id;
this.upi = up;
this.part = pt;
this.firstName = lname;
this.lastName = lname;
【讨论】:
一般来说也不应该是MonoBehaviour
!不允许实现构造函数,也不允许将new
用于MonoBehaviour
!以上是关于读取 csv 并添加到 List<Custom class> 会给出不一致的空值的主要内容,如果未能解决你的问题,请参考以下文章
pandas将列表list插入到dataframe的单元格中pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes)
如何通过读取shell脚本中的csv文件来将2列的总和添加到新列中