2012-09-12 22 views
2

我创建了一个浏览按钮让用户选择一个文件,然后当他们点击上传按钮时,它应该在控制器中激发该功能。将CSV文件和解析数据上传到Grails中的数组?

我已经设置了视图和控制器的空功能,我一直在寻找“Grails CSV Plugin”,以帮助解析文件,但从使用信息我似乎无法掌握如何我可以得到这个CSV数据到一个阵列?

可以any1请帮助我吗?在此先感谢

这是我的控制器,它基本上是空的:

package com.smstool 

import org.springframework.dao.DataIntegrityViolationException 

class UploadController { 

    def index() { 
     redirect(action: "upload", params: params) 
    } 

    def upload() { 

     } 

} 

而我的观点简单地包含这种形式:

<g:form action="upload" method="post" enctype="multipart/form-data"> 
      <label for="file">File:</label> 
      <input type="file" name="file" id="file"/> 
      <input class="save" type="submit" value="Upload"/> 
     </g:form> 

我只是在控制器尝试这样做:

@Grab('com.xlson.groovycsv:groovycsv:1.0') 
import static com.xlson.groovycsv.CsvParser.parseCsv 

import org.springframework.dao.DataIntegrityViolationException 

class UploadController { 

    def index() { 
     redirect(action: "upload", params: params) 
    } 

    def upload() { 


     } 


    def batchUpload() { 

      def csv = new File('file') 

      //def csv = '''Name,Lastname 
      //Mark,Andersson 
      //Pete,Hansen''' 

      def data = parseCsv(csv) 

      for(line in data) { 
       println "$line.Number" 
      } 
    } 



} 

这不起作用,因为我得到以下错误,任何想法?

Error 500: Internal Server Error 

URI 
    /upload/batchUpload 
Class 
    groovy.lang.MissingMethodException 
Message 
    No signature of method: static com.xlson.groovycsv.CsvParser.parseCsv() is applicable for argument types: (java.io.File) values: [file] Possible solutions: parseCsv(java.io.Reader), parseCsv(java.lang.String), parseCsv(java.util.Map, java.io.Reader), parseCsv(java.util.Map, java.lang.String), parse(java.io.Reader), parse(java.lang.String) 

Around line 28 of grails-app/controllers/com/tool/UploadController.groovy 

25:   //Mark,Andersson26:   //Pete,Hansen'''27:   28:   def data = parseCsv(csv)29:   30:   for(line in data) {31:    println "$line.Number" 

Around line 195 of PageFragmentCachingFilter.java 

192:   if (CollectionUtils.isEmpty(cacheOperations)) {193:    log.debug("No cacheable annotation found for {}:{} {}",194:      new Object[] { request.getMethod(), request.getRequestURI(), getContext() });195:    chain.doFilter(request, response);196:    return;197:   }198: 

Around line 63 of AbstractFilter.java 

60:  try {61:   // NO_FILTER set for RequestDispatcher forwards to avoid double gzipping62:   if (filterNotDisabled(request)) {63:    doFilter(request, response, chain);64:   }65:   else {66:    chain.doFilter(req, res); 

Trace 

    Line | Method 
->> 28 | batchUpload in UploadController.groovy 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 195 | doFilter in PageFragmentCachingFilter.java 
|  63 | doFilter . in AbstractFilter.java 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run . . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run   in java.lang.Thread 
+0

您可以发布一些代码? –

回答

3

查看:

<g:uploadForm action="upload"> 
    <input type="file" name="file"> 
    <g:submitButton name="upload" value="Upload"/> 
</g:uploadForm> 

控制器,安装Grails的CSV插件:

def upload() { 
    def file = request.getFile('file') 
    def allLines = file.inputStream.toCsvReader().readAll() 
    ... 
} 
+0

这确实有效,信息已经存储。我有3行数据与标题,我只需要获取1行的数据并将其存储到一个数组中,我怎么能做到这一点?谢谢 – user723858

+0

任何人都可以请帮助吗? – user723858

0

要读一个单一的线或第一行:

def upload() { 
    def file = request.getFile('file') 
    def aLine = file.inputStream.toCsvReader().readNext() 
    ... 
}