user2809386
user2809386

Reputation:

get next Row when importing file CSV with grails

i am trying to import file CSV like this image..

this image means..

when i import this file..line 1 with read and save in to Table SeniorHighSchool then it will get :

  1. name : Alexander
  2. age : 15
  3. muchcourse : 3

after that i want make a condition, When "muchcourse is filled" it will read the next row... example : at this case, the "muchcourse" is "3", then "look at the image"..row 2,3,4 (3 lines)will inserted to other table .. because the "muchcourse" is "3"

enter image description here

this is my coding what i have tried .

def upload = {
            withForm{
                def f = request.getFile('filecsv')
                def orifilename = f.getOriginalFilename()
                def homeDir = new File(System.getProperty("user.home")) 
                def homeurl = "Documents/Uploads/"
                File fileDest = new File(homeDir,homeurl+orifilename)
                f.transferTo(fileDest)  

                request.getFile(new File(fileDest)).InputStream.splitEachLine(',') {fields ->
                def student= new SeniorHighSchool(
                    name: fields[0].trim(),
                    age: fields[1].trim(),
                    muchcourse: fields[2].trim()

                    )
                if (student.hasErrors() || student.save(flush: true) == null)
                {
                    log.error("Could not import domainObject  ${student.errors}")
                }
                }

                redirect(action:"list")

            }
                }

i confused to make a condition..

  def upload = {
                    withForm{
                        def f = request.getFile('filecsv')
                        def orifilename = f.getOriginalFilename()
                        def homeDir = new File(System.getProperty("user.home")) 
                        def homeurl = "Documents/Uploads/"
                        File fileDest = new File(homeDir,homeurl+orifilename)
                        f.transferTo(fileDest)  

                        request.getFile(new File(fileDest)).InputStream.splitEachLine(',') {fields ->
                        def student= new SeniorHighSchool(
                            name: fields[0].trim(),
                            age: fields[1].trim(),
                            muchcourse: fields[2].trim()

                            )
                        if (student.hasErrors() || student.save(flush: true) == null)
                        {
                            log.error("Could not import domainObject  ${student.errors}")
                        }

                       if(fields[2]) {
                       def score = new Score(
                       course: //the problem at this line..how?
                               //it will insert 3 times then back to the row 5 to insert into "Student" again
                        )



    }
                        }

                        redirect(action:"list")

                    }


 }

Upvotes: 0

Views: 157

Answers (3)

th3morg
th3morg

Reputation: 4779

If the class SeniorHighStudent "static hasMany = [scores: Score]" then the following should do the trick:

    def currentStudent
    request.getFile(new File(fileDest)).InputStream.splitEachLine(',') {fields ->
        if(fields.size()>2){
            if(currentStudent){
                /*we've found a new student, so save the previous one*/
                currentStudent.save()
            }
            currentStudent = new SeniorHighSchool(
                    name: fields[0].trim(),
                    age: fields[1].trim(),
                    muchcourse: fields[2].trim()
            )
        }
        else{
            /*add the score to the currentStudent's scores*/
            currentStudent.addToScores(new Score(
                    course:fields[0].trim(),
                    score:fields[1].trim()
            ))
        }
    }
    /*when the loop is done, save the last student because it hasn't been saved yet*/
    currentStudent.save()

Upvotes: 0

user2809386
user2809386

Reputation:

@th3morg like thiss?

request.getFile(new File(fileDest)).InputStream.splitEachLine(',') {fields ->
if(fields.size()>2){
  def student= new SeniorHighSchool(
                    name: fields[0].trim(),
                    age: fields[1].trim(),
                    muchcourse: fields[2].trim()
                    )
}
else{
  def score = new Score(
  course:fields[0].trim(),
  score:fields[1].trim()  
  )
}



}

Upvotes: 0

Visme
Visme

Reputation: 983

if(fields.size()>2){
  store 3 values in one table(student)
}
else{
  store 2 values in another table(score)
}

If muchcourse field is occured then fields size is 3 then save three data in one table. otherwise size is 2 then save that two data in another table.I think it will solve your problem.

Upvotes: 2

Related Questions