Groovy分割CSV

Groovy分割CSV,csv,groovy,split,Csv,Groovy,Split,我有一个csv文件(details.csv),比如 当我使用时(注意:我在上面有其他的闭包,它从目录中读取所有csv文件) 我得到的不是3号尺码,而是6号数值 1 "{foo bar}" "{123 mainst ny}" spilt(,)是用逗号(,)分割数据,但我希望我的结果是 1 "{foo,bar}" "{123,mainst,ny}" 我怎样才能解决这个问题。请帮忙!谢谢编写csv解析器是件棘手的事情 我会让其他人来做这项艰苦的工作,并使用一些东西 下面是如何用GroovyCsv

我有一个csv文件(details.csv),比如

当我使用时(注意:我在上面有其他的闭包,它从目录中读取所有csv文件)

我得到的不是3号尺码,而是6号数值

1
"{foo
bar}"
"{123
mainst
ny}"
spilt(,)是用逗号(,)分割数据,但我希望我的结果是

1
"{foo,bar}"
"{123,mainst,ny}"

我怎样才能解决这个问题。请帮忙!谢谢

编写csv解析器是件棘手的事情

我会让其他人来做这项艰苦的工作,并使用一些东西


下面是如何用GroovyCsv解析它

// I'm using Grab instead of just adding the jar and its
// dependencies to the classpath
@Grab( 'com.xlson.groovycsv:groovycsv:1.0' )
import com.xlson.groovycsv.CsvParser

def csv = '''ID,NAME,ADDRESS
1,"{foo,bar}","{123,mainst,ny}"
2,"{abc,def}","{124,mainst,Va}"
3,"{pqr,xyz}","{125,mainst,IL}"'''

def csva = CsvParser.parseCsv( csv )
csva.each {
  println it
}
其中打印:

ID: 1, NAME: {foo,bar}, ADDRESS: {123,mainst,ny}
ID: 2, NAME: {abc,def}, ADDRESS: {124,mainst,Va}
ID: 3, NAME: {pqr,xyz}, ADDRESS: {125,mainst,IL}
因此,要获取第二行的名称字段,可以执行以下操作:

def csvb = CsvParser.parseCsv( csv )
println csvb[ 1 ].NAME
哪张照片

{abc,def}
当然,如果CSV是一个文件,您可以执行以下操作:

def csvc = new File( 'path/to/csv' ).withReader {
  CsvParser.parseCsv( it )
}

然后如上所述使用它有两种方法。 一种是使用collect

def processCsvData(Map csvDataMap, File file)
{

    InputStream inputFile = new FileInputStream(file);
    String[] lines = inputFile.text.split('\n')
    List<String[]> rows = lines.collect {it.split(',')}
          // Add processing logic
}
def processCsvData(映射csvDataMap,文件)
{
InputStream inputFile=新文件InputStream(文件);
String[]line=inputFile.text.split('\n')
List rows=lines.collect{it.split(',')}
//添加处理逻辑
}
这里的问题是删除大括号({})之间的逗号,即“{foo,bar}”变成“{foo-bar}” 另一种使用java的方法,这很好

public class CSVParser { 

    /* 
     * This Pattern will match on either quoted text or text between commas, including 
     * whitespace, and accounting for beginning and end of line. 
     */ 
    private final Pattern csvPattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?:,|$)");   
    private ArrayList<String> allMatches = null;         
    private Matcher matcher = null; 
    private int size; 

    public CSVParser() {                 
        allMatches = new ArrayList<String>(); 
        matcher = null; 
    } 

    public String[] parse(String csvLine) { 
        matcher = csvPattern.matcher(csvLine); 
        allMatches.clear(); 
        String match; 
        while (matcher.find()) { 
                match = matcher.group(1); 
                if (match!=null) { 
                        allMatches.add(match); 
                } 
                else { 
                        allMatches.add(matcher.group(2)); 
                } 
        } 

        size = allMatches.size();                
        if (size > 0) { 
                return allMatches.toArray(new String[size]); 
        } 
        else { 
                return new String[0]; 
        }                        
    }    

}
公共类CSVParser{
/* 
*此模式将在引号文本或逗号之间的文本上匹配,包括
*空格,并说明行的开头和结尾。
*/ 

private final Pattern csvPattern=Pattern.compile(“\”([^\“]*)\”)\“|(?String.split(String regex))将在您传入的任何正则表达式上进行拆分。因为您只是传入“,”它还在值中包含的逗号上拆分。您需要一个忽略这些逗号的正则表达式,或者找到一个解析CSV文件的Java/Groovy库。您可以在Groovy中将整个Java类重写为
public class CSVParser{public String[]parse(String csvLine){def matcher=csvLine=~/“([^”]*)”|(?我仍然会使用一个预先编写的CSV解析库,让我试试这个,然后再给你回复。不,这个类根本不工作。如果我打印它[1],它的打印会将空值放入每个CSV列,除了{}中的某些内容抱歉,这对我没什么帮助!我计划使用第一个api中提供的解决方案。当我尝试此api时,我会了解它是如何将我的头与值结合在一起的,而不是以我想要的格式提供。由于我需要尽快完成此任务,我在下面的回答中遵循了第一种方法。@springpress添加了一些代码,说明如何使用它。…如您所见,它确实有效…我不确定此逻辑是否已更改,但需要注意的是,上面代码中定义的csv字符串的格式非常重要。
def csv='''
header1、header2、header3 value1、value2、value3'''不会产生预期结果。
def processCsvData(Map csvDataMap, File file)
{

    InputStream inputFile = new FileInputStream(file);
    String[] lines = inputFile.text.split('\n')
    List<String[]> rows = lines.collect {it.split(',')}
          // Add processing logic
}
public class CSVParser { 

    /* 
     * This Pattern will match on either quoted text or text between commas, including 
     * whitespace, and accounting for beginning and end of line. 
     */ 
    private final Pattern csvPattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?:,|$)");   
    private ArrayList<String> allMatches = null;         
    private Matcher matcher = null; 
    private int size; 

    public CSVParser() {                 
        allMatches = new ArrayList<String>(); 
        matcher = null; 
    } 

    public String[] parse(String csvLine) { 
        matcher = csvPattern.matcher(csvLine); 
        allMatches.clear(); 
        String match; 
        while (matcher.find()) { 
                match = matcher.group(1); 
                if (match!=null) { 
                        allMatches.add(match); 
                } 
                else { 
                        allMatches.add(matcher.group(2)); 
                } 
        } 

        size = allMatches.size();                
        if (size > 0) { 
                return allMatches.toArray(new String[size]); 
        } 
        else { 
                return new String[0]; 
        }                        
    }    

}