我正在寻找有关如何处理正在建立的csv文件的建议,而后由咱们的客户上传,而且该值可能带有逗号(例如公司名称)。 html
咱们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|。 而不是逗号。 最大的问题是咱们必须使其变得容易,不然客户将没法作到。 socket
添加对Microsoft.VisualBasic的引用(是的,它说是VisualBasic,但它也能够在C#中工做-请记住,最后都只是IL)。 spa
使用Microsoft.VisualBasic.FileIO.TextFieldParser
类分析CSV文件,这是示例代码: .net
Dim parser As TextFieldParser = New TextFieldParser("C:\mar0112.csv") parser.TextFieldType = FieldType.Delimited parser.SetDelimiters(",") While Not parser.EndOfData 'Processing row Dim fields() As String = parser.ReadFields For Each field As String In fields 'TODO: Process field Next parser.Close() End While
nuget提供了一个库,用于处理几乎任何格式良好的CSV(.net) -CsvHelper code
映射到类的示例: htm
var csv = new CsvReader( textReader ); var records = csv.GetRecords<MyClass>();
读取各个字段的示例: get
var csv = new CsvReader( textReader ); while( csv.Read() ) { var intField = csv.GetField<int>( 0 ); var stringField = csv.GetField<string>( 1 ); var boolField = csv.GetField<bool>( "HeaderName" ); }
让客户端驱动文件格式:
,
是标准字段定界符, "
是用于转义包含定界符,引号或行尾的字段的标准值。 string
要将(例如) #
用于字段,将'
用于转义: it
var csv = new CsvReader( textReader ); csv.Configuration.Delimiter = "#"; csv.Configuration.Quote = '''; // read the file however meets your needs
更多文件 io
您能够使用替代的“定界符”,例如“;” 或“ |” 但最简单的可能只是引用(大多数(体面的)CSV库和大多数体面的电子表格支持)。
有关CSV分隔符的更多信息以及用于描述分隔符和引用的标准格式的规范,请参见此网页
您能够像这样读取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++; }
若是您对关于如何通常地解析文件的更具教育意义的练习感兴趣(以CSV为例),则能够查看Julian Bucknall的这篇文章 。 我喜欢这篇文章,由于它能够将事情分解成更小的问题,这些问题要可贵多。 首先建立一个语法,一旦有了良好的语法,将语法转换为代码是一个相对容易且有条理的过程。
本文使用C#,并在底部具备一个连接来下载代码。