我正在寻找关于如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且可能在值中有逗号,如公司名称。

我们正在考虑的一些想法是:带引号的标识符(value "," values ","等等)或使用|代替逗号。最大的问题是我们必须让它变得简单,否则客户就不会这么做。


当前回答

    public static IEnumerable<string> LineSplitter(this string line, char 
         separator, char skip = '"')
    {
        var fieldStart = 0;
        for (var i = 0; i < line.Length; i++)
        {
            if (line[i] == separator)
            {
                yield return line.Substring(fieldStart, i - fieldStart);
                fieldStart = i + 1;
            }
            else if (i == line.Length - 1)
            {
                yield return line.Substring(fieldStart, i - fieldStart + 1);
                fieldStart = i + 1;
            }

            if (line[i] == '"')
                for (i++; i < line.Length && line[i] != skip; i++) { }
        }

        if (line[line.Length - 1] == separator)
        {
            yield return string.Empty;
        }
    }

其他回答

首先,让我们问问自己,“为什么我们觉得需要在CSV文件中以不同的方式处理逗号?”

对我来说,答案是:“因为当我将数据导出到CSV文件时,字段中的逗号消失了,我的字段被分隔成多个字段,其中逗号出现在原始数据中。”(这是因为逗号是CSV字段分隔符。)

根据您的情况,分号也可以用作CSV字段分隔符。

根据我的要求,我可以使用一个字符,例如,单个低9引号,它看起来像一个逗号。

所以,下面是你在Go中如何做到这一点:

// Replace special CSV characters with single low-9 quotation mark
func Scrub(a interface{}) string {
    s := fmt.Sprint(a)
    s = strings.Replace(s, ",", "‚", -1)
    s = strings.Replace(s, ";", "‚", -1)
    return s
}

Replace函数中的第二个逗号字符是十进制8218。

请注意,如果您的客户端可能只有ascii文本阅读器,那么这个十进制8218字符看起来不会像逗号。如果这是您的情况,那么根据RFC 4128,我建议用逗号(或分号)和双引号包围字段:https://www.rfc-editor.org/rfc/rfc4180

在字符串周围加双引号。这就是Excel所做的。

阿拉伊莱,

将双引号转义为2 双引号。如。 “test1”、“foo”“酒吧”,“test2”

您可以像这样读取csv文件。

这利用了分割和空格。

ArrayList List = new ArrayList();
static ServerSocket Server;
static Socket socket;
static ArrayList<Object> list = new ArrayList<Object>();


public static void ReadFromXcel() throws FileNotFoundException
{   
    File f = new File("Book.csv");
    Scanner in = new Scanner(f);
    int count  =0;
    String[] date;
    String[] name;
    String[] Temp = new String[10];
    String[] Temp2 = new String[10];
    String[] numbers;
    ArrayList<String[]> List = new ArrayList<String[]>();
    HashMap m = new HashMap();

         in.nextLine();
         date = in.nextLine().split(",");
         name = in.nextLine().split(",");
         numbers = in.nextLine().split(",");
         while(in.hasNext())
         {
             String[] one = in.nextLine().split(",");
             List.add(one);
         }
         int xount = 0;
         //Making sure the lines don't start with a blank
         for(int y = 0; y<= date.length-1; y++)
         {
             if(!date[y].equals(""))
             {   
                 Temp[xount] = date[y];
                 Temp2[xount] = name[y];
                 xount++;
             }
         }

         date = Temp;
         name =Temp2;
         int counter = 0;
         while(counter < List.size())
         {
             String[] list = List.get(counter);
             String sNo = list[0];
             String Surname = list[1];
             String Name = list[2];
             for(int x = 3; x < list.length; x++)
             {           
                 m.put(numbers[x], list[x]);
             }
            Object newOne = new newOne(sNo, Name, Surname, m, false);
             StudentList.add(s);
             System.out.println(s.sNo);
             counter++;
         }

感谢这篇文章中的其他人。

我使用这里的信息在JavaScript中创建了一个函数,该函数将为一个对象数组获取csv输出,该对象数组的属性值可能包含逗号。

like

rowsArray = [{obj1prop1: "foo", obj1prop2: "bar,baz"}, {obj2prop1: "qux", obj2prop2: "quux,corge,thud"}]

into

csvRowsArray = [{obj1prop1: "foo", obj1prop2: "\"bar,baz\""}, {...} ] 

要在csv中的值中使用逗号,值需要用双引号括起来。为了在json对象的值中有双引号,它们只需要转义,即,“\”,反斜杠双引号。这里的转义是通过在模板文本中添加子元素并包括必要的引号' "${row[key]}" '来实现的。引号在放入对象时被转义。

这是我的函数:

const calculateTheCSVExport = (props) => {
  if (props.rows === undefined) return;

  let jsonRowsArray = props.rows;
  // console.log(jsonRowsArray);

  let csvRowsArrayNoCommasInObjectValues = [];
  let csvCurrRowObject = {}

  jsonRowsArray.forEach(row => {
    Object.keys(row).forEach(key => {
      // console.log(key, row[key])
      if (row[key].indexOf(',') > -1) {
        csvCurrRowObject = {...csvCurrRowObject, [key]: `"${row[key]}"`} // enclose value in escaped double quotes in JSON in order to export commas to csv correctly. see more: https://stackoverflow.com/questions/769621/dealing-with-commas-in-a-csv-file
      } else {
        csvCurrRowObject = {...csvCurrRowObject, [key]: row[key]}
      }
    });

    csvRowsArrayNoCommasInObjectValues.push(csvCurrRowObject);
    csvCurrRowObject = {};
  })

  // console.log(csvRowsArrayNoCommasInObjectValues)
  return csvRowsArrayNoCommasInObjectValues;
}

使用制表符(\t)分隔字段。