c语言读csv

c语言读csv,第1张

//随便写了一个,只能取到抛砖引玉的效果,时间有限。如果有不明白的地方再和我联系吧

#define MAXCHAR 100

int main()

{

FILE *pb

int i,num = 0,j = 0

char pchar[MAXCHAR]

char **ppstr

char *pstr,*ppchar

memset(pchar, 0, 100)

pb = fopen("D:\\pb.csv","r")

if (pb == NULL)

{

printf("error!")

return

}

ppstr = (char **)malloc(5*sizeof(char *))//这个最多可以存5条数据

pstr = (char *)malloc(5*20)//最多5条数据,每个数据不超过20-1=19

for (i = 0i <5i++)

{

ppstr[i] = pstr + i*20

}

memset(pstr, 0 ,100)

fseek(pb, 0, SEEK_SET)

fread(pchar, 1, 100, pb)

ppchar = pchar

i = 0

while (*ppchar)

{

if (*ppchar == 0x2c)//csv文件中一条数据和另外一条数据之间分隔符0x2c

{

memcpy(ppstr[j], pchar+num,i - num)

j++

num = i+1

}

if (*ppchar == 0x0a)//CSV文件中的换行符

{

memcpy(ppstr[j], pchar+num,i - num)

j++

num = i+1

}

i++

ppchar++

}

for (i = 0i <ji++)

{

printf("%s\n", ppstr[i])

}

free(pstr)

free(ppstr)

return

}

/// <summary>

/// 将DataTable中数据写入到CSV文件中

/// </summary>

/// <param name="dt">提供保存数据的DataTable</param>

/// <param name="fileName">CSV的文件路径</param>

public static bool SaveCSV(DataTable dt, string fullPath)

{

try

{

FileInfo fi = new FileInfo(fullPath)

if (!fi.Directory.Exists)

{

fi.Directory.Create()

}

FileStream fs = new FileStream(fullPath, System.IO.FileMode.Create, System.IO.FileAccess.Write)

//StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default)

StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8)

string data = ""

//写出列名称

for (int i = 0 i < dt.Columns.Count i++)

{

data += "\"" + dt.Columns[i].ColumnName.ToString() + "\""

if (i < dt.Columns.Count - 1)

{

data += ","

}

}

sw.WriteLine(data)

//写出各行数据

for (int i = 0 i < dt.Rows.Count i++)

{

data = ""

for (int j = 0 j < dt.Columns.Count j++)

{

string str = dt.Rows[i][j].ToString()

str = string.Format("\"{0}\"", str)

data += str

if (j < dt.Columns.Count - 1)

{

data += ","

}

}

sw.WriteLine(data)

}

sw.Close()

fs.Close()

return true

}

catch

{

return false

}

}

/// <summary>

/// 读取CSV文件到DataTable中

/// </summary>

/// <param name="filePath">CSV的文件路径</param>

/// <returns></returns>

public static DataTable ReadCSV(string filePath)

{

DataTable dt = new DataTable()

int lineNumber = 0

using (CsvFileReader reader = new CsvFileReader(filePath))

{

CsvRow row = new CsvRow()

while (reader.ReadRow(row))

{

if (0 == lineNumber)

{

foreach (string s in row)

{

dt.Columns.Add(s.Replace("\"", ""))

}

}

else

{

int index = 0

DataRow dr = dt.NewRow()

foreach (string s in row)

{

dr[index] = s.Replace("\"", "")

index++

}

dt.Rows.Add(dr)

}

lineNumber++

}

}

return dt

}

public class CsvRow : List<string>

{

public string LineText { get set }

}

public class CsvFileReader : StreamReader

{

public CsvFileReader(Stream stream)

            : base(stream)

        {

}

public CsvFileReader(string filename)

            : base(filename)

        {

}

/// <summary>  

/// Reads a row of data from a CSV file  

/// </summary>  

/// <param name="row"></param>  

/// <returns></returns>  

public bool ReadRow(CsvRow row)

{

row.LineText = ReadLine()

if (String.IsNullOrEmpty(row.LineText))

return false

int pos = 0

int rows = 0

while (pos < row.LineText.Length)

{

string value

// Special handling for quoted field  

if (row.LineText[pos] == '"')

{

// Skip initial quote  

pos++

// Parse quoted value  

int start = pos

while (pos < row.LineText.Length)

{

// Test for quote character  

if (row.LineText[pos] == '"')

{

// Found one  

pos++

// If two quotes together, keep one  

// Otherwise, indicates end of value  

if (pos >= row.LineText.Length || row.LineText[pos] != '"')

{

pos--

break

}

}

pos++

}

value = row.LineText.Substring(start, pos - start)

value = value.Replace("\"\"", "\"")

}

else

{

// Parse unquoted value  

int start = pos

while (pos < row.LineText.Length && row.LineText[pos] != ',')

pos++

value = row.LineText.Substring(start, pos - start)

}

// Add field to list  

if (rows < row.Count)

row[rows] = value

else

row.Add(value)

rows++

// Eat up to and including next comma  

while (pos < row.LineText.Length && row.LineText[pos] != ',')

pos++

if (pos < row.LineText.Length)

pos++

}

// Delete any unused items  

while (row.Count > rows)

row.RemoveAt(rows)

// Return true if any columns read  

return (row.Count > 0)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11481075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存