【问题标题】:laravel combine two csv's without overwriting similar data in each onelaravel 合并两个 csv 而不覆盖每个中的相似数据
【发布时间】:2019-10-13 15:55:43
【问题描述】:

在 excel 中,有一个名为“粘贴特殊 -> 跳过空单元格”的功能。本质上,它的作用是允许您获取两个 csv,每个包含相同的列,然后将不同的数据粘贴到电子表格中,而无需覆盖现有数据。我需要尝试在 PHP 中复制它。

我有 3 台机器,每台机器都用于检查处于考试不同阶段的学生。机器 1 将有一个数据列,如“name=Adam,exam1=pass,exam2=null,exam3=null”。机器 2 将具有“name=Adam,exam1=null,exam2=pass,exam3=null”,而机器 3,您可以猜到将是“name=Adam,exam1=null,exam2=null,exam3=pass”。现在,在 Excel 中,我可以使用“skip empty”将机器 1 复制到机器 2 中,这将导致“name=Adam,exam1=pass,exam2=pass,exam3=null”。然后将新文件从机器 2 复制到机器 3,它会给我学生“name=Adam,exam1=pass,exam2=pass,exam3=pass”的完整结果。但是,我必须在 10-15 台机器上执行此操作。我想找到一种自动化的方法。

我尝试在刀片中使用此代码:

        <label for="exampleFormControlFile1">CSV Upload</label>
        <input type="file" name="csv_import[]" class="form-control-file" id="exampleFormControlFile1">
        <br/><br/>
        <label for="exampleFormControlFile2">CSV Upload</label>
        <input type="file" name="csv_import[]" class="form-control-file" id="exampleFormControlFile2">
        <br/><br/>

        <input type='submit' name='submit' value='Import' class="btn btn-primary">

这是我的控制器:

  public function combineCSV(Request $request){
    $csv = request('csv_import');
    for($i = 0; $i < 3; $i++){
        $path = $request->file($csv[0])->store('excel-files');
        $products = (new FastExcel)->import($request->file($path), function ($line) {
          $student = Student::where('student_id', $line->student_id)->first();
        });
    }

}

我知道这是非常错误的(显然是因为我遇到了错误)。但我还不熟悉 csv 或文件操作。我正在尝试将 github 上的 FastExcel 包用于 laravel,没有特别的原因。如果有更好的包,我完全愿意使用它。但是我如何上传多个文件,逐行扫描并说“如果exam​​1 == null && csv->exam1 == null,继续,否则如果exam​​1 == null && csv->exam1 == 通过,更新记录”。

【问题讨论】:

    标签: laravel csv


    【解决方案1】:

    对于未来的任何人,这就是我解决它的方法。

      $csv = request('csv_import');
        for($i = 0; $i < sizeof($csv); $i++){ //loop through all csv's
          $file = fopen($csv[$i],"r");
              $c = 0;
              while (($data = fgetcsv($file, 0, ',')) !== FALSE) { //iterate over each line
                if($c == 0){ //if first line of csv contains headers, skip first line
                  $c++;
                  continue;
                } else { //search for student by 3 identifying criteria
                  $student = Combine::where('fname', $data[1])->
                                      where('lname', $data[2])->
                                      where('student_number', $data[3])->first();
    
                  if($student){ //if student exists, check that field in csv is null and that new csv contains data where existing csv contains no data
                      if ($student->test1 == NULL && $data[4] != NULL){
                       $student->test1 = $data[4];
                   }
                  if ($student->test2 == NULL && $data[5] != NULL){
                      $student->test2 = $data[5];
                  }              
                  $student->save();
                } else { //if student not found, create new one
                  $student = new Student();
                  $student->fname = $data[1];
                  $student->lname = $data[2];
                  $student->student_number = $data[3];
                  $student->test1 = $data[4];
                  $student->test2 = $data[5];
                  $student->save();
                }
              }
              }
    
              fclose($file);
        }
          return Excel::download(new CombineExport, 'combined.csv');
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2021-07-01
      • 2022-11-02
      • 1970-01-01
      • 2013-07-11
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多