读取 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> 会给出不一致的空值的主要内容,如果未能解决你的问题,请参考以下文章

使用streamreader读取csv时如何跳过第一行

pandas将列表list插入到dataframe的单元格中pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes)

如何通过读取shell脚本中的csv文件来将2列的总和添加到新列中

如何提取多个 zip 文件并在 R 中读取这些 csv? [复制]

python读取csv文件并添加索引

python之小应用:读取csv文件并处理01数据串