sas循环读取数据csv

sas循环读取数据csv,第1张

SAS循环读取数据CSV是指使用SAS程序来读取CSV文件中的数据。SAS程序可以使用INFILE语句来读取CSV文件中的数据,并且可以使用DO循环来循环读取每一行的数据。此外,SAS还提供了一个特殊的语句叫做INPUT,它可以帮助我们更加灵活地读取CSV文件中的数据。

csv文件即逗号分隔值文件。

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。

CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。

要用C语言读取CSV,首先需要确定文件中定义的字符分隔值,以及每一行各个列的元素格式。

如果所有的元素格式相同,那么可以每行一个一维数组,所有行组成一个二维数组,逐个元素进行读取。

如果元素格式不同,可以按照元素类型,构建一个结构体,每行读到一个结构体变量中,所有行组成一个结构体数组。

下面根据两种情况,按照分隔符为逗号(,),分别举一个例子:

文件名设定为in.csv,每行10个元素。

一、所有元素均相同类型,比如int型。

#include <stdio.h>

int main()

{

FILE*fp

int a[100][10]//定义一个足够大的数组来存储。

int line = 0

int c, i

fp = fopen("in.csv", "r")// 以文本方式打开。

if(fp == NULL) return -1// 打开文件失败。

while(1)

{

i=0//列标记清零。

while(1)

{

fscanf(fp, "%d", &a[line][i])//从文件中读取一个元素。

c = getchar()//读取下一个字符,可能是分隔符,换行符或文件结尾。

if(c == '\n'||c == EOF)break//读完一行,或者到文件结尾,退出读取。

i++

}

line ++

if(c == EOF) break

}

fclose(fp)//关闭文件。

//以下循环用来打印所有读到的值。

for(i = 0i <linei ++)

{

for(c = 0c <10c ++)

printf("%d ", a[i][c])

printf("\n")

}

}

二、每行元素不同。

比如共三列,第一列是int型,第二列是字符串,第三列是float型。

如果分隔符不是空白字符,或者字符串元素中可能存在除分隔符外的其它空白字符,在读取字符串的时候是不能用fscanf函数的。

定义结构体如下

strcut data

{

int a

char s[100]//根据实际要求,定义足够大的字符数组。

float f

}

读取代码如下:

#include <stdio.h>

int main()

{

FILE*fp

strcut data a[100]//定义一个足够大的结构体一维数组来存储。

int line = 0

int c,i

fp = fopen("in.csv", "r")// 以文本方式打开。

if(fp == NULL) return -1// 打开文件失败。

while(1)

{

fscanf(fp, "%d", &a[line].a)//从文件中读取第一个元素。

c = getchar()//读取分隔符。

//接下来要读取字符串,需要逐个字符读入,直到出现分隔符为止。

i = 0

while(1)

{

a[line].s[i] = getchar()//读入一个字符。

if(a[line].s[i] == ',')//发现分隔符

{

a[line].s[i]='\0'//赋值字符串结束符。

break//退出读取字符串。

}

i++

}

//由于在读字符串的时候分隔符已经被读取,这里不需要读分隔符,而是直接读下一个元素。

fscanf(fp, "%f", &a[line].f)//从文件中读取最后一个元素。

c = getchar()//读取下一个字符,可能是换行符或文件结尾。

line ++

if(c == EOF) break//到文件结尾,退出读取。

}

fclose(fp)//关闭文件。

//以下循环用来打印所有读到的值。

for(i = 0i <linei ++)

{

printf("%d %s %f\n", a[i].a, a[i].s, a[i].f)

}

}

第一种方式: 先入库后使用

我们假设现在有有一个CSV文件Contacts.CSV 文件的内容是联系人信息。首先我们需要在数据库中建一个对应的表TC_Contacts,然后利用下面的SQL代码将CSV文件导入到这个表里面:

INSERT INTO TC_Contacts

2

3 SELECT * FROM

4 OPENROWSET('MSDASQL',

5 'Driver={Microsoft Text Driver (*.txt*.csv)}

6 DEFAULTDIR=D:/DataExtensions=CSV',

7 'SELECT * FROM "Contacts.CSV"')

其中:1.TC_Contacts为目标表的名字。

对于目标表,要求对应的字段能够接收CSV文件中对象列的数据,这里特别需要注意的是字符串的长度,日期时间格式和整数浮点数的处理由于CSV文件中实际上都是字符串,那么在导入的过程中就有可能出现不能转换的情况。例如:日期格式不符合数据库的要求,或者字符串不能转化为整数或者浮点数等。

对于目标表,字段数目和顺序可以和CSV文件中的不一样。其实在整个的SQL语句中只有OPENROWSET是用来处理CSV文件的。其它部分都是普通的T-SQL,在T-SQL中能做的事情在这里都可以做。例如:如果你的TC_Contacts比CSV多一个字段gid uniqueidentifier ,那么就可以把SQL语句修改为:

1 INSERT INTO TC_Contacts

2 SELECT newid(),* FROM

3 OPENROWSET('MSDASQL',

4 'Driver={Microsoft Text Driver (*.txt*.csv)}

5 DEFAULTDIR=D:/DataExtensions=CSV',

6 'SELECT * FROM "Contacts.CSV"')

这样就可以给每条记录增加一个id了。

2.SQL代码中的DefaultDir 也就是D:/Data 是指存在于SQL Server服务器上的位置,而不是在提交该代码的客户机上。这一点对于初次接触的人来说很关键。SQL Server如果在服务器上找不到文件会报告错误。但是这个错误的消息不是那么直接了当。

3.有的CSV文件中第一行不是列标题,而是和其它行一样是普通的数据行。这个时候就需要一个Schema.ini来定义CSV文件的格式。Schema.ini的格式我会专门写一篇来介绍一下。在Schema.ini文件中会指定CSV文件的一些特性,这样有助于Microsoft Text Driver来处理数据.

第二种:直接使用

通过OdbcConnection可以创建一个链接到csv文件的链接,链接字符串的格式是:"Driver={Microsoft Text Driver (*.txt*.csv)}Dbq="+cvs文件的文件夹路径+" Extensions=asc,csv,tab,txtPersist Security Info=False"

创建连接之后就可以使用DataAdapter等存取csv文件了。

public DataSet getdatasetfromcsv(string filepath, string filename)

{

string strconn = @"driver={microsoft text driver (*.txt*.csv)}dbq="

strconn += filepath //filepath, for example: c:/

strconn += "extensions=asc,csv,tab,txt"

OdbcConnection objconn = new OdbcConnection(strconn)

DataSet dscsv = new DataSet()

try

{

string strsql = "select * from " + filename//filename, for example: 1.csv

OdbcDataAdapter odbccsvdataadapter = new OdbcDataAdapter(strsql,objconn)

odbccsvdataadapter.Fill(dscsv)

return dscsv

}

catch(Exception ex)

{

throw ex

}

}


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

原文地址:https://54852.com/yw/11990167.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存