C# 讀CSV文件

来源:http://www.cnblogs.com/gujunyan/archive/2016/06/12/5576666.html
-Advertisement-
Play Games

近期都在處理淘寶商品數據包識別問題,滿以為CSV文件就是以行為分割,以逗號為欄位分割的文件體系。 自己在編寫處理程式時,增加了2個參數: 第一個,字元集,第二,告知處理方法,文件的列在第幾行。 同時,對某些生成出來的數據包不規據的,例如生成出2個同名列的,等等文件,做了一定的容錯。 滿以為這樣就OK ...


近期都在處理淘寶商品數據包識別問題,滿以為CSV文件就是以行為分割,以逗號為欄位分割的文件體系。

自己在編寫處理程式時,增加了2個參數: 第一個,字元集,第二,告知處理方法,文件的列在第幾行。 

同時,對某些生成出來的數據包不規據的,例如生成出2個同名列的,等等文件,做了一定的容錯。

滿以為這樣就OK了,沒想到,老革命遇上新問題。原來 CSV文件中還是有轉義的,引號即是。這一個處理,導致

程式出現了嚴重BUG,有一批數據包無法識別。。。。

現程式已經優化過。本CSV閱讀程式,直接將CSV文件轉換成TABLE格式,可以識別引號,可以識別在字元串中的回車,比一般網上查找的CSV文件

閱讀程式要好,我試過,基本和WPS(我機器上沒裝OFFICE)容錯能力一致。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace test
{
public class JHCSV
{
public static DataTable LoadCsv(string filename, System.Text.Encoding encoder, char pfix, int headerLineIndex)
{
List<string> dataList = getData(filename, encoder);

DataTable dt = Getdt(dataList, headerLineIndex, pfix);

for (int i = headerLineIndex + 1; i < dataList.Count; i++)
{
if (dataList[i].Trim().Equals(""))
{
continue;
}
else
{
DataRow dr = dt.NewRow();
ReadLine(ref dr, dataList[i], pfix);
dt.Rows.Add(dr);
}
}

return dt;
}

private static DataRow ReadLine(ref DataRow dr, string line, char pfix)
{
string[] data = line.Split(new char[] { pfix });
StringBuilder ValueBuffer = new StringBuilder("");
int columnIndex = 0;
foreach (string str in data)
{
ValueBuffer.Append(str);
if (checkyh(ValueBuffer.ToString(), '"'))
{
ValueBuffer = ValueBuffer.Replace("\"\"", "\"");
if (columnIndex < dr.Table.Columns.Count)
{
dr[columnIndex] = ValueBuffer.ToString().TrimStart('"').TrimEnd('"');
columnIndex++;
ValueBuffer.Clear();
}
else
{
Console.WriteLine(ValueBuffer.ToString());
ValueBuffer.Clear();
continue;
}
}
else
{
ValueBuffer.Append(pfix);
}
}
return dr;

}


private static DataTable Getdt(List<string> data, int headIndex, char pfix)
{
DataTable dt = new DataTable();
string[] columns = data[headIndex].Split(new char[] { pfix });
foreach (string columnname in columns)
{
if (columnname.Equals(""))
{
continue;
}
else
{
if (dt.Columns[columnname] != null)
{
dt.Columns.Add(columnname + "1");
}
else
{
dt.Columns.Add(columnname);
}

}
}

return dt;
}


private static List<string> getData(string filename, System.Text.Encoding encoder)
{
System.IO.StreamReader sr = new System.IO.StreamReader(filename, encoder);
List<string> dataList = new List<string>();
string line = sr.ReadLine();
System.Text.StringBuilder lineBuffer = new StringBuilder("");
while (line != null)
{
lineBuffer.Append(line);
if (checkyh(lineBuffer.ToString(),'\"'))
{
dataList.Add(lineBuffer.ToString());
lineBuffer = new StringBuilder("");
}

line = sr.ReadLine();
}

sr.Close();

return dataList;
}

public static bool checkyh(string str,char cp)
{
int i = 0;
foreach (char c in str)
{
if(c=='\"')
{
i++;
}
}

if (i % 2 == 0)
{
return true;
}
else
{
return false;
}
}
}
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux中如何使用gThumb批量調整圖片大小 Linux中如何使用gThumb批量調整圖片大小 Linux中如何使用gThumb批量調整圖片大小 導讀 如果你的工作涉及到圖片編輯和處理,就一定會有同時對多張圖片進行批量大小調整的經歷。雖然大多數圖片編輯應用都能夠非常容易地批量調整多張圖片,但對於 ...
  • DOS 和 Linux 常用命令的對比 許多在 shell 提示下鍵入的 Linux 命令都與你在 DOS 下鍵入的命令相似。事實上,某些命令完全相同。 本附錄提供了 Windows 的 DOS 提示下的常用命令以及在 Linux 中與它們等同的命令。附錄中還提供瞭如何在 Linux shell 提 ...
  • 1) 重啟後生效 開啟: chkconfig iptables on 關閉: chkconfig iptables off 2) 即時生效,重啟後失效 開啟: service iptables start 關閉: service iptables stop 需要說明的是對於Linux下的其它服務都可 ...
  • linux系統中通過chmod來修改文件和目錄許可權,其中要非常註意文件和目錄許可權各自的含義和差別。 ...
  • 所有可能的設置:新建一個文件夾,將它命名為“some_name.{ED7BA470-8E54-465E-825C-99712043E01C}”,打開就是這臺電腦的所有設置視窗【所有的設置視窗都在桌面的文件夾里】 雙擊鎖住電腦:在桌面上新建一個快捷方式,在鍵入項目的地址上輸入“rundll32.exe ...
  • Let's Encrypt是一個免費SSL證書發行項目,發行的證書已經獲得主流瀏覽器的支持,親測谷歌瀏覽器(桌面版)、火狐瀏覽器(桌面版)、UC瀏覽器(手機版)、360瀏覽器(手機版)支持,其它的暫沒測試; 本文講解如何使用Let's Encrypt獲得免費SSL證書,配置apache的SSL功能, ...
  • 源內容:http://www.cnblogs.com/shouce/p/5558095.html#undefined 下麵的內容是根據“源內容”進行了整改、補充。 三種方式實例化一類,包括無參數構造形式與有參數構造形式性能測試。 測試環境: 1) Visual studio 2015 Communi ...
  • 先收藏,後看;千萬不要做一個屯書的人,一定要堅持有選擇性的看下去; 資料庫類 資料庫類 SqlServer Oracle .NET 更多... .NET 更多... Web 更多... Web 更多... 架構 架構 不颳了,直接可以看到了。 鏈接: http://pan.baidu.com/s/1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...