为SilverStripe

时间:2015-07-23 20:39:10

标签: php csv silverstripe

我正在为SilverStripe网站构建自定义导入控件,因为将要使用的CSV文件遗憾的是没有正确格式化的CSV文件,无法改进(我们必须使用我们的#39)基本上重新给出。这些文件包含半色分离数据,每行是一个条目:

"[ID]";"[First Name]";"[Middle Initial]";"[Last Name]";"[Title]";"[University/College]";"[Specialty]";"[Graduation Date]"

这些值中的任何一个都可能为空(即,一个条目可能没有中间的首字母,或者它可能没有列出专业)。然后,这些字段只标记为一对双引号中的单个空格:

"[ID]";"[First Name]";" ";"[Last Name]";"[Title]";"[University/College]";" ";"[Graduation Date]"

同样重要的是要注意CSV文件没有标题,并且它们不太可能拥有它们。我已经阅读了SilverStripe的CSVBulkLoader类,但似乎没有标题,很难使用它。另外,像我提到的那样存在空白字段的问题。

是否可以设置一个文件以分号分隔CSV文件中的数据?通过这种方式,我可以在一行中获取每个值,然后我可以将它们映射到SilverStripe管理模型中的字段。

这是我目前正在处理的管理模型:

<?php
class PhysicianEducationAdmin extends ModelAdmin {

    private static $managed_models = array('PhysicianEducation');
    private static $url_segment = 'physicianeducation';
    private static $menu_title = 'Physician Education Info';

}

<?php

class PhysicianEducation extends DataObject {

    private static $db = array(
        'ProviderID' => 'varchar',
        'FirstName' => 'varchar(250)',
        'MiddleName' => 'varchar(250)',
        'LastName' => 'varchar(250)',
        'Title' => 'varchar(10)',
        'Institution' => 'varchar(550)',
        'Education' => 'varchar(250)',
        'Specialty' => 'varchar(250)',
        'EndDate' => 'Date',
    );

    public static $summary_fields = array(
        'ProviderID' => 'Provider ID',
        'FirstName' => 'First Name',
        'MiddleName' => 'Middle Initial',
        'LastName' => 'Last Name',
        'Title' => 'Title',
        'Institution' => 'Institution',
        'Education' => 'Education',
        'Specialty' => 'Speciality',
        'EndDate' => 'End Date',
    );

}

2 个答案:

答案 0 :(得分:2)

您应该能够使用fgetcsv()函数http://php.net/manual/en/function.fgetcsv.php

它允许您指定分隔符(对于您';')和机箱(对于您'''),这是默认值。

答案 1 :(得分:1)

Silverstripe包含可用于此的CSVParser class。您可以将分隔符作为构造函数的第二个参数传递。由于文件没有标题行,您可以使用provideHeaderRow函数为其提供标题行。 CSVParser实现了Iterator接口,因此您可以循环遍历对象:

$physicians = CSVParser::create('myfile.csv', ';');
$physicians->provideHeaderRow(array(...));

foreach($physicians as $physician) {
  $pe = PhysicianEducation::create()->update($physician);
  $pe->write();
}

您需要向DataObject添加一些验证(可能在onBeforeWrite中进行一些检查,或者创建Validator的子类)以防止创建无效记录(例如空字段)。