Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 导入CSV文件时按列顺序处理更改_C#_Excel_.net 3.5 - Fatal编程技术网

C# 导入CSV文件时按列顺序处理更改

C# 导入CSV文件时按列顺序处理更改,c#,excel,.net-3.5,C#,Excel,.net 3.5,我有一个CSV文件。第一行将始终包含列标题。根据各种因素,列的顺序可能会发生变化,在极少数情况下,某些列可能不存在。这些变化是我无法控制的 到目前为止,我的想法是如何解决这个问题。我将读取文件的第一行,并使用这些值生成源文件中包含的列列表。目标文件将使用与源文件相同的列名。这应该和在源和目标中搜索相同的名称一样简单,然后只映射列索引值,对吗 您对此有何建议?我曾经这样做过,即构建一个哈希映射,将我希望出现的列的名称映射到实际出现的列标题的索引或实际列名称。为此,我首先用我期望的所有列名作为键,一

我有一个CSV文件。第一行将始终包含列标题。根据各种因素,列的顺序可能会发生变化,在极少数情况下,某些列可能不存在。这些变化是我无法控制的

到目前为止,我的想法是如何解决这个问题。我将读取文件的第一行,并使用这些值生成源文件中包含的列列表。目标文件将使用与源文件相同的列名。这应该和在源和目标中搜索相同的名称一样简单,然后只映射列索引值,对吗


您对此有何建议?

我曾经这样做过,即构建一个哈希映射,将我希望出现的列的名称映射到实际出现的列标题的索引或实际列名称。为此,我首先用我期望的所有列名作为键,一些值(如-1)作为值来构建映射。然后我得到了列标题的数组。使用嵌套循环遍历映射中所有键的循环和文件中存在的所有头,我在删除空白后进行了不区分大小写的比较,如果有匹配项,我将列的索引作为映射中该键的值。然后,在构建目标文件时,我所要做的就是循环遍历CSV中每一行的映射中的键,从映射中指定的索引中获取数据,并对数据执行我想要的任何操作,如果映射中的值为-1,则忽略该列。我是用Java做的,但我想它在C中几乎完全一样。

如果我要这样做,我会使用SQL和DAO。有两个窍门。第一个是建立与Excel工作表的连接,就像它是一个数据库表一样,您需要DAO 3.6对象库作为VBA中的参考

Dim dbtmp As dao.Database
Dim qd As dao.QueryDef

Set dbtmp = OpenDatabase(mPath & "\" & mName, False, True, "Excel 8.0;")
Set qd = dbtmp.CreateQueryDef("", " THE QUERY ")
qd.Execute
第二个是作为数据源建立到CSV文件的连接。其格式类似于:

mQuery = "SELECT * FROM [Text;HDR=NO;CharacterSet=437;DATABASE="
mQuery = mQuery & mpath
mQuery = mQuery & "]."
mQuery = mQuery & mfile
mQuery = mQuery & ";"
您必须使用代码构建SQL,您需要在sourcefile中建立字段,并且您正在构建INSERT INTO查询。而且,最简单的方法可能是对具有名称的源数据创建select查询,然后在insert into查询中使用它


这样做的好处是,SQL将处理源数据中缺少的字段,并且不会对列的显示顺序过于挑剔。您可以通过将csv作为文本文件打开来获取标题。

简单,将csv文件加载到内存中,更改列顺序,保存文件。 ,对LINQ来说很容易

// Create the IEnumerable data source  
string[] lines = System.IO.File.ReadAllLines(@"../../../spreadsheet1.csv");  

// Create the query. Put field 2 first, then  
// reverse and combine fields 0 and 1 from the old field  
IEnumerable<string> query =  
    from line in lines  
    let x = line.Split(',')  
    orderby x[2]  
    select x[2] + ", " + (x[1] + " " + x[0]);  

// Execute the query and write out the new file. Note that WriteAllLines  
// takes a string[], so ToArray is called on the query.  
System.IO.File.WriteAllLines(@"../../../spreadsheet2.csv", query.ToArray());  
Console.WriteLine("Spreadsheet2.csv written to disk. Press any key to exit");  
Console.ReadKey();  

你想用CSV文件做什么?您只是简单地将文件转换为具有特定顺序的列的文件吗?是否要为缺少的列插入空白值?你到底想实现什么?是的,这是一个简单的转换。如果源文件中不存在该列,则目标文件中该列将为null。