#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)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)