把csv文件转化为C语言的结构体化代码演示
- 格式:doc
- 大小:26.79 KB
- 文档页数:23
【原创】CSV格式文件的编辑全攻略2010-09-28 04:58最近换了新手机,高兴了没两天头疼的事情就来了,原来用的诺基亚N73导出的联系人名单是vcf的,但现在的手机只认CSV格式,而且我的联系人下经常都有好几个电话,用SIM卡导入相当麻烦,所以只能想办法转换过来。
用谷歌百度了大半夜,总算转换了过来。
网上办法众多,就不再赘述了,个人感觉还是用Foxmail转换最省心。
终于说道重点了。
转成CSV格式以后却不能导入,后来才发现原因:每款手机的CSV格式都略有不同,所以不能盲目导入。
最重要的一点,千万不要用excel编辑CSV,下场无一例外都是悲剧,这一点我深有体会。
明白了以上两点问题就不是那么难了首先要做的就是用新手机导出一份csv文件作模板。
这是我转换过来的SCV文件,我只用excl看了,并没有编辑。
这是模板,注意到表头的不同了吧搞到模板以后,用word打开模板:选择其他编码——Unicode 点确定进入word后,在常用按钮栏里打开“显示/隐藏编辑标记”这样就可以看到CSV文件中的制表符,(之所以用excel编辑后不能导入就是这些制表符被打乱了)。
还需要改的一个设置在工具----自动更正选项里:把键入时自动套用格式选项卡里的直引号替换为弯引号勾选去掉这一步是一定要做的,否则打出的双引号都是中文的,文件将不能导入。
让CSV文件露出“真面目”现在我们就能很明了的看到CSV文件的格式了。
每个值都是用直引号括起来的,值与值之间用制表符隔开,第一个值等于第一个项目名,第二个个值等于第二个项目名,以此类推。
知道了CSV的格式后我们就能正确的编辑了。
但是又有个问题来了,如果有两三百个联系人,一个一个都要敲上双引号和制表符,那不疯掉了!!还得要想想办法,对了!我们还有WORD的神器----替换功能。
要用替换功能,我们首先要做点准备工作,再猛的炮火射不准也是瞎忙活,我们要制造一批可以大喊“向我开炮的”炮灰们来提高准度。
matlab将元胞数组元素转化为字符串的方法1.引言1.1 概述概述部分的内容可以描述关于元胞数组和字符串之间的转换问题的背景和重要性。
以下是一个可能的概述部分的例子:引言部分是介绍和展示读者篇文章所要解决的问题或探讨的主题的部分。
本篇文章将会探讨在MATLAB中将元胞数组元素转换为字符串的方法。
元胞数组是MATLAB中一种特殊的数据类型,它可以存储不同类型的数据,并且可以方便地进行多维数组和嵌套数组的表示。
然而,在处理元胞数组时,有时候我们需要将元胞数组的元素转化为字符串形式以方便处理或显示。
本文将介绍一些常见的方法和技巧,帮助读者了解如何在MATLAB中将元胞数组元素转化为字符串。
这些方法包括使用内置的函数和操作符,以及自定义的函数。
通过学习这些转换方法,读者可以更加灵活和高效地处理元胞数组,并在数据处理、可视化和分析中发挥更大的作用。
本篇文章的下一部分将会对元胞数组的基本概念进行介绍,以确保读者对元胞数组的理解和使用有一定的基础。
然后,我们将详细讨论元胞数组元素转化为字符串的方法,并提供具体的示例和代码。
最后,在结论部分,我们将对本文的主要内容进行总结,并展望一些元胞数组元素转化为字符串的方法的应用前景。
通过阅读本文,读者将能够更好地理解和运用MATLAB中的元胞数组,掌握将元胞数组元素转化为字符串的方法,并应用于自己的具体问题和项目中。
无论是在科学研究、工程应用还是数据分析等领域,这些知识都将对读者有所帮助。
接下来,我们将首先介绍元胞数组的基本概念。
1.2文章结构文章结构是指在撰写文章时所采用的组织框架。
一个良好的文章结构可以使读者更容易理解文章的内容和逻辑,同时也能帮助作者更清晰地表达自己的观点和主题。
在本文中,我们将介绍关于如何将元胞数组元素转化为字符串的方法,以下是文章的结构:1. 引言1.1 概述在这一部分,我们将简要介绍元胞数组的基本概念以及元胞数组在MATLAB中的应用。
1.2 文章结构在这一部分,我们将介绍本文的结构和目录,以便读者更好地理解文章的组织和内容。
csv编辑格式CSV(逗号分隔值)是一种常用的文件格式,用于存储和交换结构化数据。
CSV文件采用纯文本形式,以逗号作为字段之间的分隔符,每行表示一个数据记录。
CSV文件的编辑格式通常遵循以下规则:字段分隔符:CSV文件使用逗号(,)作为字段之间的分隔符。
逗号是默认的分隔符,但有时也可以使用其他字符作为分隔符,如制表符(\t)或分号(;)。
字段定界符:字段可以使用双引号(")进行定界。
如果字段值包含逗号、换行符或双引号等特殊字符,可以使用双引号将该字段括起来。
被括起来的字段中的双引号可以用两个双引号("")表示。
行定界符:每行表示一个数据记录,行之间使用换行符进行分隔。
常见的换行符有回车换行(\r\n)和换行(\n)。
文件编码:CSV文件通常使用UTF-8编码,以确保支持多种字符集。
以下是一个示例CSV文件的编辑格式:复制代码姓名,年龄,城市张三,25,北京李四,30,上海王五,28,广州在上面的示例中,第一行是表头,定义了每个字段的名称。
后续的行表示具体的数据记录,每个字段之间用逗号分隔。
注意,CSV文件的编辑格式可能因不同的应用程序或标准而有所差异。
因此,在实际使用中,最好查阅相关文档或参考特定应用程序的要求来确保正确的格式。
将CSV文件添加到数据库步骤连接数据库:使用适当的数据库连接工具或库,连接到目标数据库。
创建表格:在数据库中创建一个与CSV文件格式相匹配的表格。
表格的列数和列名应该与CSV文件中的字段相匹配。
读取CSV文件:使用适当的CSV读取库或工具,读取CSV文件的内容。
插入数据:将读取到的CSV数据插入到数据库表格中。
可以使用SQL语句或数据库库提供的方法来完成插入操作。
以下是一个使用Python和SQLite数据库的示例代码,将CSV文件添加到数据库:python复制代码import sqlite3import csv# 连接数据库conn = sqlite3.connect('example.db')cursor = conn.cursor()# 创建表格cursor.execute('''CREATE TABLE IF NOT EXISTS data(name TEXT, age INT, city TEXT)''')# 读取CSV文件with open('data.csv', 'r') as csvfile:reader = csv.reader(csvfile)for row in reader:name = row[0]age = int(row[1])city = row[2]cursor.execute("INSERT INTO data (name, age, city) VALUES (?, ?, ?)", (name, age, city))# 提交更改并关闭连接mit()conn.close()在上述示例代码中,首先使用SQLite连接工具连接到SQLite数据库。
【主题】:从utf-8编码到汉字的转换——深入探讨C语言的编码与解码技术【内容】一、概述在计算机科学领域,编码与解码技术一直是一个重要的研究课题。
特别是对于中文字符的编码与解码,更是受到了广泛关注。
在本文中,我们将围绕着utf-8编码与汉字的转换展开讨论,重点聚焦在C语言的编码与解码技术上。
二、了解utf-8编码1. 什么是utf-8编码utf-8编码是一种针对UNICODE的可变长度字符编码。
它可以用1~4个字节来表示一个字符,适合用于互联网传输。
utf-8编码采用了一种对ASCII编码的优化方法,使得英文字符可以用1个字节表示,而中文字符则需要用3个字节来表示。
2. utf-8编码的特点utf-8编码的特点包括:向后兼容ASCII编码、无字节顺序标记、只有一个编码表示形式等。
这些特点使得utf-8编码成为了当今最为流行的字符编码方式之一。
三、C语言中的utf-8编码与解码1. C语言中的字符编码在C语言中,每个字符都有一个对应的整数值,即字符编码。
常见的字符编码方式有ASCII码、EBCDIC码以及utf-8编码等。
而C语言本身并没有提供对utf-8编码的原生支持,因此我们需要借助一些库函数来实现utf-8编码与解码的操作。
2. utf-8编码与解码的实现在C语言中,我们可以借助一些开源的库函数来实现utf-8编码与解码的操作,比如iconv、utf8proc等。
这些库函数提供了丰富的接口,可以帮助我们实现对utf-8编码的处理,包括字符的转换、长度的计算、错误的处理等。
3. 实例演示:使用C语言进行utf-8编码与解码接下来,我们将通过一个实例来演示如何使用C语言进行utf-8编码与解码的操作。
我们需要包含相应的头文件,并初始化相关的变量。
我们可以通过调用库函数来实现utf-8编码与解码的功能,最后输出结果并进行必要的错误处理。
四、utf-8编码与汉字的转换1. utf-8编码到汉字的转换utf-8编码到汉字的转换实质上是一个解码的过程。
CSV简单解析与排序输出读取CSV每⼀⾏,每⼀⾏内容在解析时可以分为2种情况:1.没扫描到" 2.扫描到"情况1:直接通过截取内容中的,来分列。
例如⾏内容为:姓名,年龄,编号。
则可以分为3列姓名年龄编号情况2:扫描⾏内容,当扫描到内容的第⼀个",去掉该",接着扫描<1>之后扫描到""则输出"<2>其他内容按照原内容输出<3>当扫描到单个符号"("之后没有紧接着")则去掉这个",该列扫描完毕。
最后输出的内容为该列的值。
例如内容为: """,","," 。
则可以分为2列",,头⽂件:1 #include<iostream>2 #include<fstream>3 #include<string>4using namespace std;56class CCsv7 {8public:9//构造函数10 CCsv(void);1112/*******************************************************************13 ** 函数名: Csv_IsCsvFile14 ** 函数描述: 判断⽂件是否是csv⽂件15 ** 参数: [in] strFileName: csv⽂件名16 ** 返回: true,是csv⽂件;false,不是csv⽂件17 *******************************************************************/18bool Csv_IsCsvFile(const string &strFileName);1920/*******************************************************************21 ** 函数名: Csv_ReadFile22 ** 函数描述: 读取CSV⽂件,并解析内容存放到vvStr,并判断csv⽂件是否规范23 ** 参数: [in] pFileName: 该csv⽂件名24 ** [in] vvStr: ⽤于存放解析内容25 ** 返回: true,解析成功;false,解析失败26 *******************************************************************/27bool Csv_ReadFile(const char* pFileName, vector<vector<string> > &vvStr);2829/*******************************************************************30 ** 函数名: Csv_AnalysisCsvLine31 ** 函数描述: 解析CSV⽂件的⼀⾏内容,并把该⾏解析内容放⼊vvStr32 ** 参数: [in] strContent: CSV⽂件的⼀⾏内容33 ** [in] vvStr: ⽤于存放解析内容34 ** 返回:35 *******************************************************************/36void Csv_AnalysisCsvLine(const string & strContent, vector<vector<string> > &vvStr);3738/*******************************************************************39 ** 函数名: Csv_ShowCsvContent40 ** 函数描述: 输出vvStr所存放的csv解析内容41 ** 参数: [in] vvStr: ⽤于存放解析内容42 ** 返回:43 *******************************************************************/44void Csv_ShowCsvContent(vector<vector<string> > &vvStr);4546//析构函数47 ~CCsv(void);48private:4950 };主程序:1 #include "stdafx.h"2 #include <iostream>3 #include <string>4 #include <vector>5 #include <algorithm>6 #include "modCsv.h"7using namespace std;89int g_rows = 0; //记录列下标10const char cQuote = '"'; //定义引号常量11const char cComma = ','; //定义逗号常量1213//CCsv构造函数14 CCsv::CCsv(void)15 {1617 }1819//CCsv析构函数20 CCsv::~CCsv(void)21 {2223 }2425//判断⽂件是否为csv⽂件26//strFileName为⽂件名27bool CCsv::Csv_IsCsvFile(const string &strFileName)28 {29//csv⽂件最少字符为a.csv,所以当⽂件名⼩于5,该⽂件就不是csv⽂件30if (strFileName.length()<5)31 {32 cout<<"该⽂件不是csv⽂件!"<<endl;33return false;34 }3536string strFileFormat = strFileName.substr(strFileName.length()-4,4);//截取⽂件的后缀名 .csv 37//将⽂件后缀变为⼩写38 transform(strFileFormat.begin(),strFileFormat.end(),strFileFormat.begin(),::tolower);3940//判断⽂件名是否是csv⽂件41if (1 == pare(".csv"))42 {43 cout<<"该⽂件不是csv⽂件!"<<endl;44return false;45 }4647return true;48 }4950//读取并解析CSV⽂件,并判断csv⽂件是否规范51//pFileName为该csv⽂件名, vvStr为⽤于存放解析内容的变量52bool CCsv::Csv_ReadFile(const char* pFileName, vector<vector<string> > &vvStr)53 {54if (pFileName == NULL)55 {56return false;57 }58//创建输⼊流59 ifstream inCsv(pFileName, ios::in);6061//判断打开⽂件是否成功62if (!inCsv)63 {64 cout<<"打开⽂件失败!\n";65return false;66 }6768//读⽂件69while (!inCsv.eof())70 {71string lineContent;72 inCsv>>lineContent; //⾏内容暂存到lineContent73//解析该⾏内容74 Csv_AnalysisCsvLine(lineContent,vvStr);75 }7677 size_t size = vvStr[0].size();//初始每⾏列数78//循环判断每⾏的列数是否⼀样79for (vector<vector<string> >::iterator vvIt = vvStr.begin(); vvIt != vvStr.end(); ++ vvIt)80 {81 g_rows++;82if ((*vvIt).size() != size)83 {84 cout<<"该csv⽂件格式不符合规范:第";85 cout<<g_rows<<"⾏有"<<(*vvIt).size()<<"列,⽽第⼀⾏有"<<size<<"列"<<endl;86break;87 }88 }8990//显⽰解析内容91 Csv_ShowCsvContent(vvStr);92return true;93 }9495//解析CSV⽂件的⼀⾏内容96void CCsv::Csv_AnalysisCsvLine(const string & strContent, vector<vector<string> > &vvStr)97 {98//string *pStrContent = &strContent;99string strRowContent = "";//初始化列内容为空100 vector<string> vRowContent ;//临时vector ,⽤于最后存⼊vvStr101102//扫描整⾏内容103for(size_t i = 0; i < strContent.size(); i++)// i 为size_t⽽不是int,是由于strContent.size()返回的是unsigned int 104 {105//当扫描到" ,表⽰⼀串字符开始106if (strContent[i] == cQuote)107 {108while (i < strContent.size())109 {110 i++;111if (strContent[i] ==cQuote)112 { //如果内容为"" ,表⽰输出转义字符"113if (strContent[i+1] == cQuote)114 {115 strRowContent += cQuote;116 i = i + 1; //指针往下117 }118//"后⾯没有紧接着",表⽰⼀列结束,break跳出循环119else120 {121break;122 }123124 }125else126 {127 strRowContent += strContent[i]; //该字符添加⼊列内容128 }129 }130//当扫描结束还是扫描不到"(字符串结束符),则该⾏的"没有成对存在,不符合csv规则131if (strContent[i] == '\0')132 {133 cout<<"该csv⽂件格式不符合规范:第"<<(vvStr.size()+1)<<"⾏的\"不匹配"<<endl;134 }135 }136//当前字符为',' ,表⽰⼀列结束137else if (strContent[i] == cComma)138 {139//把strRowContent存放的列的内容放⼊vRowContent140 vRowContent.push_back(strRowContent);141 strRowContent = "";142 }143else144 {145 strRowContent += strContent[i]; //该字符添加⼊列内容146 }147 }148//把strRowContent存放的列的内容放⼊vRowContent149 vRowContent.push_back(strRowContent);150//把该⾏所有列的内容村放⼊vvStr151 vvStr.push_back(vRowContent);152 }153154//输出 vector<vector<string> > &vvStr 所存放的csv解析内容155void CCsv::Csv_ShowCsvContent(vector<vector<string> > &vvStr)156 {157//⽤迭代⽅式输出 vector<list<string>> vlStr 所存放的csv解析内容158for (vector<vector<string> >::iterator vvIt = vvStr.begin(); vvIt != vvStr.end(); ++ vvIt)159 {160for (vector<string>::iterator vIt = (*vvIt).begin(); vIt != (*vvIt).end(); ++ vIt)161 {162 cout<<*vIt<<"";163 }164 cout<<endl;165 }166 }167168bool SortMethod(const vector<string> &vStr1, const vector<string> &vStr2)//本函数的参数的类型⼀定要与vector中元素的类型⼀致169 {170return vStr1[g_rows-1] < vStr2[g_rows-1];//升序排列171 }172173int main(void)174 {175 CCsv csv;//定义csv对象176string strFileName = "in.csv";//定义csv的⽂件名177178//判断⽂件是否为csv⽂件,若不是直接结束程序179if(!csv.Csv_IsCsvFile(strFileName))180 {181return0;182 }183184const char* pFileName = &strFileName[0]; //定义要解析的⽂件名185 vector<vector<string> > vvStr ; //⽤于存放解析内容186187 cout<<"FileName:"<<pFileName<<endl;188189//读取并解析pFileName到vvStr中190 csv.Csv_ReadFile(pFileName, vvStr);191192 cout<<"输⼊需要排序的列(";193//⽤迭代的⽅式输出列的可选排序项194 g_rows = 0;195for (vector<string>::iterator vIt = vvStr[0].begin(); vIt != vvStr[0].end(); ++vIt)196 {197 cout<<++g_rows<<"."<<*vIt<<"";198 }199 cout<<"):";200201//输⼊需要排序的列202 cin>>g_rows;203204//排序函数205 sort((vvStr.begin()+1),vvStr.end(),SortMethod);206207//显⽰排序后的csv内容208 csv.Csv_ShowCsvContent(vvStr);209210return1;211 }新⼿刚上路,代码还有很多缺陷仍在改进中。
libcsv用法-概述说明以及解释1.引言1.1 概述概述部分:libcsv是一个用于处理CSV格式数据的开源库,它提供了简单、方便的接口,使得开发者能够轻松地读取和写入CSV文件。
CSV (Comma-Separated Values)是一种常用的数据交换格式,通常用于存储表格数据,每行数据由逗号分隔,因此CSV格式数据非常适合用于存储简单结构的数据。
libcsv库的设计初衷是为了简化CSV数据的处理过程,使开发者更加专注于数据处理逻辑的实现,而不必关心CSV文件的解析和生成细节。
通过libcsv,开发者可以轻松地读取CSV文件中的数据,并进行相应的操作,比如数据过滤、转换、导出等。
在本文中,我们将介绍libcsv的基本用法和高级应用,探讨其优势和应用场景,同时展望其未来的发展方向。
通过学习libcsv的用法,希望读者能够更加高效地处理CSV格式数据,提升数据处理的效率和质量。
1.2 文章结构:本文将分为引言、正文和结论三个部分来讨论libcsv的用法。
在引言部分,我们将介绍本文的概述、结构和目的,以让读者对本文有一个整体的了解。
在正文部分,我们将深入探讨libcsv库的简介、基本用法和高级应用,帮助读者更好地了解如何使用这个库来处理csv文件。
最后,在结论部分,我们将总结libcsv的优势,讨论其应用场景,并展望其未来发展方向,以帮助读者更加全面地认识和了解这一工具。
通过这样的结构,读者能够系统性地了解libcsv的用法和价值,为将来的实际应用提供便利。
1.3 目的:本文旨在介绍libcsv的基本用法和高级应用,帮助读者对该库有一个全面的了解。
通过本文的阐述,读者将能够学会如何使用libcsv来处理CSV文件,实现数据的读取、写入以及其他常见操作。
同时,我们还将探讨libcsv在实际项目中的应用场景,展示其在数据处理和管理方面的优势。
最终,我们希望读者能够通过本文对libcsv有一个深入的认识,从而更好地应用该库解决实际问题,提升工作效率和数据处理的准确性。
VC中Ansi、Unicode、UTF8字符串之间的转换和写入文本Ansi字符串我们最熟悉英文占一个字节汉字2个字节以一个0结尾常用于txt文本文件Unicode字符串每个字符汉字、英文字母都占2个字节以2个连续的0结尾NT操作系统内核用的是这种字符串常被定义为typedef unsigned short wchar_t所以我们有时常会见到什么char无法转换为unsigned short之类的错误其实就是unicode UTF8是Unicode一种压缩形式英文A在unicode中表示为0x0041老外觉得这种存储方式太浪费因为浪费了50的空间于是就把英文压缩成1个字节成了utf8编码但是汉字在utf8中占3个字节显然用做中文不如ansi合算这就是中国的网页用作ansi编码而老外的网页常用utf8的原因。
UTF8在还游戏里运用的很广泛比如WOW的lua脚本等下面来说一下转换主要用代码来说明吧写文件我用了CFile类其实用FILE之类的也是一样写文件和字符串什么类别没有关系硬件只关心数据和长度Ansi转Unicode 介绍2种方法void CConvertDlg::OnBnClickedButtonAnsiToUnicode // ansi to unicode char szAnsi abcd1234你我他//预转换得到所需空间的大小intwcsLen ::MultiByteToWideCharCP_ACP NULL szAnsi strlenszAnsi NULL 0 //分配空间要给0留个空间MultiByteToWideChar不会给0空间wchar_t wszString new wchar_twcsLen 1 //转换::MultiByteToWideCharCP_ACP NULL szAnsi strlenszAnsi wszString wcsLen //最后加上0 wszStringwcsLen 0 //unicode版的MessageBoxAPI ::MessageBoxWGetSafeHwnd wszString wszString MB_OK //接下来写入文本//写文本文件头2个字节0xfeff低位0xff写在前CFile cFile cFile.Open_T1.txt CFile::modeWrite CFile::modeCreate //文件开头cFile.SeekToBegincFile.Writexffxfe 2 //写入内容cFile.WritewszString wcsLen sizeofwchar_tcFile.Flush cFile.Close delete wszString wszString NULL //方法2 //设置当前地域信息不设置的话使用这种方法中文不会正确显示//需要include setlocaleLC_CTYPE chs wchar_t wcsStr100 //注意下面是大写S在unicode中代表后面是ansi字符串//swprintf 是sprintf的unicode版本//格式的前面要加大写L代表是unicode swprintfwcsStr LS szAnsi ::MessageBoxWGetSafeHwnd wcsStr wcsStr MB_OK Unicode转Ansi 也是2种方法void CConvertDlg::OnBnClickedButtonUnicodeToAnsi // unicode to ansi wchar_t wszString Labcd1234你我他//预转换得到所需空间的大小这次用的函数和上面名字相反int ansiLen ::WideCharToMultiByteCP_ACP NULL wszString wcslenwszString NULL 0 NULL NULL //同上分配空间要给0留个空间char szAnsi new charansiLen 1 //转换//unicode版对应的strlen是wcslen ::WideCharToMultiByteCP_ACP NULL wszString wcslenwszString szAnsi ansiLen NULL NULL //最后加上0 szAnsiansiLen 0 //Ansi版的MessageBoxAPI ::MessageBoxAGetSafeHwnd szAnsi szAnsi MB_OK //接下来写入文本//写文本文件ANSI文件没有BOM CFile cFile cFile.Open_T1.txt CFile::modeWriteCFile::modeCreate //文件开头cFile.SeekToBegin //写入内容cFile.WriteszAnsi ansiLen sizeofchar cFile.Flush cFile.Close delete szAnsi szAnsi NULL //方法2 //和上面一样有另一种方法setlocaleLC_CTYPE chs char szStr100 //注意下面是大写在ansi 中代表后面是unicode字符串//sprintf sprintfszStr SwszString ::MessageBoxAGetSafeHwnd szStr szStr MB_OK Unicode转UTF8 void CConvertDlg::OnBnClickedButtonUnicodeToU8 // unicode to UTF8 wchar_twszString Labcd1234你我他//预转换得到所需空间的大小这次用的函数和上面名字相反int u8Len ::WideCharToMultiByteCP_UTF8 NULL wszString wcslenwszString NULL 0 NULL NULL //同上分配空间要给0留个空间//UTF8虽然是Unicode的压缩形式但也是多字节字符串所以可以以char的形式保存char szU8 new charu8Len 1 //转换//unicode版对应的strlen是wcslen ::WideCharToMultiByteCP_UTF8 NULL wszString wcslenwszString szU8u8Len NULL NULL //最后加上0 szU8u8Len 0 //MessageBox不支持UTF8所以只能写文件//接下来写入文本//写文本文件UTF8的BOM是0xbfbbef CFile cFilecFile.Open_T1.txt CFile::modeWrite CFile::modeCreate //文件开头cFile.SeekToBegin //写BOM同样低位写在前cFile.Writexefxbbxbf 3 //写入内容cFile.WriteszU8 u8Len sizeofchar cFile.Flush cFile.Close delete szU8 szU8 NULL UTF8转UNICODE void CConvertDlg::OnBnClickedButtonU8ToUnicode //UTF8 to Unicode //由于中文直接复制过来会成乱码编译器有时会报错故采用16进制形式char szU8 abcd1234xe4xbdxa0xe6x88x91xe4xbbx96x00 //预转换得到所需空间的大小int wcsLen ::MultiByteToWideCharCP_UTF8 NULL szU8 strlenszU8 NULL 0 //分配空间要给0留个空间MultiByteToWideChar不会给0空间wchar_t wszString new wchar_twcsLen 1 //转换::MultiByteToWideCharCP_UTF8 NULL szU8 strlenszU8 wszString wcsLen //最后加上0 wszStringwcsLen 0 //unicode版的MessageBoxAPI ::MessageBoxWGetSafeHwnd wszString wszString MB_OK //写文本同ansi to unicode Ansi转换utf8和utf8转换Ansi就是上面2个的结合把unicode作为中间量进行2次转换即可。
C#多个CSV⽂件合并成⼀个⽂件using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;namespace WindowsFormsApplication1{public partial class Form1 : Form{string FileName = string.Empty;DataTable dtExcelData;public Form1(){InitializeComponent();}private void bthChose_Click(object sender, EventArgs e){OpenFileDialog opd = new OpenFileDialog();//实例化选择打开窗⼝对象opd.Multiselect = false;//定义不允许多选opd.Filter = "(*.*)|*.csv";//设置可以选择所有⽂件if (opd.ShowDialog() == DialogResult.OK){//写⼊⾃⼰的代码txtFileName.Text = opd.FileName;FileName = opd.FileName;}opd.Dispose();}private void button1_Click(object sender, EventArgs e){string path = "";string fname = "";if (FileName.Length <= 0){MessageBox.Show("请上传⽂件");return;}else if (System.IO.Path.GetExtension(FileName) != ".csv"){MessageBox.Show("请上传csv格式⽂件");return;}else{path = FileName.Substring(0, stIndexOf("\\") + 1);// fname = FileName.Substring(stIndexOf("\\") + 1);}GetDate(path);}public void GetDate(string path){try{DataGridView dgv = new DataGridView();dgv.RowHeadersVisible = true;dgv.Columns.Clear();dgv.Columns.Add("Sort", "Sort");dgv.Columns.Add("TN", "TN");dgv.Columns.Add("FileName", "FileName");string[] FileNameList = Directory.GetFiles(path);Array.Sort(FileNameList,new TSort() );int i = 0;foreach (String filePath in FileNameList){i++;string fname = filePath.Substring(stIndexOf("\\") + 1); StreamReader sr = new StreamReader(filePath);while (true){String strData = sr.ReadLine();if (!String.IsNullOrEmpty(strData)){String[] strValue = strData.Split(',');int index = dgv.Rows.Add();DataGridViewRow dr = dgv.Rows[index];dr.Cells[0].Value = i.ToString();dr.Cells[1].Value = strValue[0];dr.Cells[2].Value = fname;}else{break;}}}if (dgv.Rows.Count > 0){ExcelHelper eh = new ExcelHelper();eh.OutToExcelFromDataGridView("TNT", dgv, false);}} catch (Exception ex){MessageBox.Show("抱歉出错了!"+ex.Message);}}}}using System;using System.Collections.Generic;using System.Text;namespace WindowsFormsApplication1{public class TSort : System.Collections.IComparer{public int Compare(object x, object y){string s1 = (string)x;string s2 = (string)y;if (s1.Length > s2.Length) return 1;if (s1.Length < s2.Length) return -1;for (int i = 0; i < s1.Length; i++){if (s1[i] > s2[i]) return 1;if (s1[i] < s2[i]) return -1;}return 0;}}}using System;using System.IO;using System.Data;using System.Collections;using System.Data.OleDb;using System.Web;using System.Windows.Forms;using System.Text;using Microsoft.Office.Interop.Excel;/// <summary>/// Excel操作类/// </summary>/// Microsoft Excel 11.0 Object Librarypublic class ExcelHelper{public bool OutToExcelFromDataGridView(string title, DataGridView dgv, bool isShowExcel){int titleColumnSpan = 0;//标题的跨列数string fileName = "tnt";//保存的excel⽂件名int columnIndex = 1;//列索引if (dgv.Rows.Count == 0)return false;/*保存对话框*///SaveFileDialog sfd = new SaveFileDialog();//sfd.Filter = "导出Excel(*.xls)|*.xls";//sfd.FileName = title + DateTime.Now.ToString("yyyyMMddhhmmss");//if (sfd.ShowDialog() == DialogResult.OK)//{// fileName = sfd.FileName;/*建⽴Excel对象*/Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); if (excel == null){MessageBox.Show("⽆法创建Excel对象,可能您的计算机未安装Excel!");return false;}try{excel.Application.Workbooks.Add(true);excel.Visible = isShowExcel;/*分析标题的跨列数*/foreach (DataGridViewColumn column in dgv.Columns){if (column.Visible == true)titleColumnSpan++;}/*合并标题单元格*/Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.ActiveSheet; //worksheet.get_Range("A1", "C10").Merge();worksheet.get_Range(worksheet.Cells[1, 1] as Range, worksheet.Cells[1, titleColumnSpan] as Range).Merge();/*⽣成标题*/excel.Cells[1, 1] = title;(excel.Cells[1, 1] as Range).HorizontalAlignment = XlHAlign.xlHAlignCenter;//标题居中//⽣成字段名称columnIndex = 1;for (int i = 0; i < dgv.ColumnCount; i++){if (dgv.Columns[i].Visible == true){excel.Cells[2, columnIndex] = dgv.Columns[i].HeaderText;(excel.Cells[2, columnIndex] as Range).HorizontalAlignment = XlHAlign.xlHAlignCenter;//字段居中columnIndex++;}}//填充数据for (int i = 0; i < dgv.RowCount; i++){columnIndex = 1;for (int j = 0; j < dgv.ColumnCount; j++){if (dgv.Columns[j].Visible == true){if (dgv[j, i].ValueType == typeof(string)){excel.Cells[i + 3, columnIndex] = "'" + dgv[j, i].Value.ToString();}else{excel.Cells[i + 3, columnIndex] = dgv[j, i].Value.ToString();}(excel.Cells[i + 3, columnIndex] as Range).HorizontalAlignment = XlHAlign.xlHAlignLeft;//字段居中columnIndex++;}}}worksheet.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);}catch { }finally{excel.Quit();excel = null;GC.Collect();}//KillProcess("Excel");return true;//}//else//{// return false;//}}private static void KillProcess(string processName)//杀死与Excel相关的进程{System.Diagnostics.Process myproc = new System.Diagnostics.Process();//得到所有打开的进程try{foreach (System.Diagnostics.Process thisproc in System.Diagnostics.Process.GetProcessesByName(processName)) {if (!thisproc.CloseMainWindow()){thisproc.Kill();}}}catch (Exception Exc){throw new Exception("", Exc);}}}。
C#读取csv格式⽂件的⽅法本⽂实例讲述了C#读取csv格式⽂件的⽅法。
分享给⼤家供⼤家参考。
具体实现⽅法如下:⼀、CSV⽂件规则1 开头是不留空,以⾏为单位。
2 可含或不含列名,含列名则居⽂件第⼀⾏。
3 ⼀⾏数据不跨⾏,⽆空⾏。
4 以半⾓逗号(即,)作分隔符,列为空也要表达其存在。
5 列内容如存在半⾓逗号(即,)则⽤半⾓引号(即',')将该字段值包含起来。
6 列内容如存在半⾓引号(即")则应替换成半⾓双引号("")转义,并⽤半⾓引号(即"")将该字段值包含起来。
7 ⽂件读写时引号,逗号操作规则互逆。
8 内码格式不限,可为 ASCII、Unicode 或者其他。
9 不⽀持特殊字符⼆、C#读取csv⽂件的⽅法复制代码代码如下://读CSV⽂件类,读取指定的CSV⽂件,可以导出DataTablepublic class CsvStreamReader{private ArrayList rowAL; //⾏链表,CSV⽂件的每⼀⾏就是⼀个链private string fileName; //⽂件名private Encoding encoding; //编码public CsvStreamReader(){this.rowAL = new ArrayList();this.fileName = "";this.encoding = Encoding.Default;}/// <summary>////// </summary>/// <param name="fileName">⽂件名,包括⽂件路径</param>public CsvStreamReader(string fileName){this.rowAL = new ArrayList();this.fileName = fileName;this.encoding = Encoding.Default;LoadCsvFile();}/// <summary>////// </summary>/// <param name="fileName">⽂件名,包括⽂件路径</param>/// <param name="encoding">⽂件编码</param>public CsvStreamReader(string fileName, Encoding encoding){this.rowAL = new ArrayList();this.fileName = fileName;this.encoding = encoding;LoadCsvFile();}/// <summary>/// ⽂件名,包括⽂件路径/// </summary>public string FileName{set{this.fileName = value;LoadCsvFile();}}/// <summary>/// ⽂件编码/// </summary>public Encoding FileEncoding{set{this.encoding = value;}}/// <summary>/// 获取⾏数/// </summary>public int RowCount{get{return this.rowAL.Count;}}/// <summary>/// 获取列数/// </summary>public int ColCount{get{int maxCol;maxCol = 0;for (int i = 0; i < this.rowAL.Count; i++){ArrayList colAL = (ArrayList)this.rowAL[i];maxCol = (maxCol > colAL.Count) ? maxCol : colAL.Count; }return maxCol;}}/// <summary>/// 获取某⾏某列的数据/// row:⾏,row = 1代表第⼀⾏/// col:列,col = 1代表第⼀列/// </summary>public string this[int row, int col]{get{//数据有效性验证CheckRowValid(row);CheckColValid(col);ArrayList colAL = (ArrayList)this.rowAL[row - 1];//如果请求列数据⼤于当前⾏的列时,返回空值if (colAL.Count < col){return "";}return colAL[col - 1].ToString();}}/// <summary>/// 根据最⼩⾏,最⼤⾏,最⼩列,最⼤列,来⽣成⼀个DataTable类型的数据 /// ⾏等于1代表第⼀⾏/// 列等于1代表第⼀列/// maxrow: -1代表最⼤⾏/// maxcol: -1代表最⼤列/// </summary>public DataTable this[int minRow, int maxRow, int minCol, int maxCol]{get{//数据有效性验证CheckRowValid(minRow);CheckMaxRowValid(maxRow);CheckColValid(minCol);CheckMaxColValid(maxCol);if (maxRow == -1){maxRow = RowCount;}if (maxCol == -1){maxCol = ColCount;}if (maxRow < minRow){throw new Exception("最⼤⾏数不能⼩于最⼩⾏数");}if (maxCol < minCol){throw new Exception("最⼤列数不能⼩于最⼩列数");}DataTable csvDT = new DataTable();int i;int col;int row;//增加列for (i = minCol; i <= maxCol; i++){csvDT.Columns.Add(i.ToString());}for (row = minRow; row <= maxRow; row++){DataRow csvDR = csvDT.NewRow();i = 0;for (col = minCol; col <= maxCol; col++){csvDR[i] = this[row, col];i++;}csvDT.Rows.Add(csvDR);}return csvDT;}}/// <summary>/// 检查⾏数是否是有效的/// </summary>/// <param name="col"></param>private void CheckRowValid(int row){if (row <= 0){throw new Exception("⾏数不能⼩于0");}if (row > RowCount){throw new Exception("没有当前⾏的数据");}}/// <summary>/// 检查最⼤⾏数是否是有效的/// </summary>/// <param name="col"></param>private void CheckMaxRowValid(int maxRow){if (maxRow <= 0 && maxRow != -1){throw new Exception("⾏数不能等于0或⼩于-1"); }if (maxRow > RowCount){throw new Exception("没有当前⾏的数据");}}/// <summary>/// 检查列数是否是有效的/// </summary>/// <param name="col"></param>private void CheckColValid(int col){if (col <= 0){throw new Exception("列数不能⼩于0");}if (col > ColCount){throw new Exception("没有当前列的数据");}}/// <summary>/// 检查检查最⼤列数是否是有效的/// </summary>/// <param name="col"></param>private void CheckMaxColValid(int maxCol){if (maxCol <= 0 && maxCol != -1){throw new Exception("列数不能等于0或⼩于-1"); }if (maxCol > ColCount){throw new Exception("没有当前列的数据");}}/// <summary>/// 载⼊CSV⽂件/// </summary>private void LoadCsvFile(){//对数据的有效性进⾏验证if (this.fileName == null){throw new Exception("请指定要载⼊的CSV⽂件名");}else if (!File.Exists(this.fileName)){throw new Exception("指定的CSV⽂件不存在");}else{}if (this.encoding == null){this.encoding = Encoding.Default;}StreamReader sr = new StreamReader(this.fileName, this.encoding);string csvDataLine;csvDataLine = "";while (true){string fileDataLine;fileDataLine = sr.ReadLine();if (fileDataLine == null){break;}if (csvDataLine == ""){csvDataLine = fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);}else{csvDataLine += "\\r\\n" + fileDataLine;//GetDeleteQuotaDataLine(fileDataLine); }//如果包含偶数个引号,说明该⾏数据中出现回车符或包含逗号if (!IfOddQuota(csvDataLine)){AddNewDataLine(csvDataLine);csvDataLine = "";}}sr.Close();//数据⾏出现奇数个引号if (csvDataLine.Length > 0){throw new Exception("CSV⽂件的格式有错误");}}/// <summary>/// 获取两个连续引号变成单个引号的数据⾏/// </summary>/// <param name="fileDataLine">⽂件数据⾏</param>/// <returns></returns>private string GetDeleteQuotaDataLine(string fileDataLine){return fileDataLine.Replace("\\"\\"", "\\"");}/// <summary>/// 判断字符串是否包含奇数个引号/// </summary>/// <param name="dataLine">数据⾏</param>/// <returns>为奇数时,返回为真;否则返回为假</returns>private bool IfOddQuota(string dataLine){int quotaCount;bool oddQuota;quotaCount = 0;for (int i = 0; i < dataLine.Length; i++){if (dataLine[i] == '\\"'){quotaCount++;}}oddQuota = false;if (quotaCount % 2 == 1){oddQuota = true;}return oddQuota;}/// <summary>/// 判断是否以奇数个引号开始/// </summary>/// <param name="dataCell"></param>/// <returns></returns>private bool IfOddStartQuota(string dataCell) {int quotaCount;bool oddQuota;quotaCount = 0;for (int i = 0; i < dataCell.Length; i++){if (dataCell[i] == '\\"'){quotaCount++;}else{break;}}oddQuota = false;if (quotaCount % 2 == 1){oddQuota = true;}return oddQuota;}/// <summary>/// 判断是否以奇数个引号结尾/// </summary>/// <param name="dataCell"></param>/// <returns></returns>private bool IfOddEndQuota(string dataCell) {int quotaCount;bool oddQuota;quotaCount = 0;for (int i = dataCell.Length - 1; i >= 0; i--) {if (dataCell[i] == '\\"'){quotaCount++;}else{break;}}oddQuota = false;if (quotaCount % 2 == 1){oddQuota = true;}return oddQuota;}/// <summary>/// 加⼊新的数据⾏/// </summary>/// <param name="newDataLine">新的数据⾏</param>private void AddNewDataLine(string newDataLine){//System.Diagnostics.Debug.WriteLine("NewLine:" + newDataLine);////return;ArrayList colAL = new ArrayList();string[] dataArray = newDataLine.Split(',');bool oddStartQuota; //是否以奇数个引号开始string cellData;oddStartQuota = false;cellData = "";for (int i = 0; i < dataArray.Length; i++){if (oddStartQuota){//因为前⾯⽤逗号分割,所以要加上逗号cellData += "," + dataArray[i];//是否以奇数个引号结尾if (IfOddEndQuota(dataArray[i])){colAL.Add(GetHandleData(cellData));oddStartQuota = false;continue;}}else{//是否以奇数个引号开始if (IfOddStartQuota(dataArray[i])){//是否以奇数个引号结尾,不能是⼀个双引号,并且不是奇数个引号if (IfOddEndQuota(dataArray[i]) && dataArray[i].Length > 2 && !IfOddQuota(dataArray[i])) {colAL.Add(GetHandleData(dataArray[i]));oddStartQuota = false;continue;}else{oddStartQuota = true;cellData = dataArray[i];continue;}}else{colAL.Add(GetHandleData(dataArray[i]));}}}if (oddStartQuota){throw new Exception("数据格式有问题");}this.rowAL.Add(colAL);}/// <summary>/// 去掉格⼦的⾸尾引号,把双引号变成单引号/// </summary>/// <param name="fileCellData"></param>/// <returns></returns>private string GetHandleData(string fileCellData){if (fileCellData == ""){return "";}if (IfOddStartQuota(fileCellData)){if (IfOddEndQuota(fileCellData)){return fileCellData.Substring(1, fileCellData.Length - 2).Replace("\\"\\"", "\\""); //去掉⾸尾引号,然后把双引号变成单引号}else{throw new Exception("数据引号⽆法匹配" + fileCellData);}}else{//考虑形如"" """" """"""if (fileCellData.Length > 2 && fileCellData[0] == '\\"'){fileCellData = fileCellData.Substring(1, fileCellData.Length - 2).Replace("\\"\\"", "\\""); //去掉⾸尾引号,然后把双引号变成单引号}}return fileCellData;}}希望本⽂所述对⼤家的C#程序设计有所帮助。
csv 编辑格式-回复[CSV 编辑格式] 一步一步回答概述:CSV(Comma-Separated Values,逗号分隔值)是一种常用于存储和传输表格数据的文件格式。
它使用逗号作为字段之间的分隔符,并且每个字段可以被引号包围。
在本文中,我们将逐步介绍如何编辑CSV 格式的文件。
第一步:打开CSV 编辑器要编辑CSV 文件,首先你需要一个CSV 编辑器。
有很多可供选择的编辑器,包括Microsoft Excel、Google Sheets等。
你可以根据自己的需求选择适合自己的编辑器。
第二步:导入CSV 文件在你的编辑器中,通常有一个“导入”选项或按钮。
点击它并选择要编辑的CSV 文件。
一旦你导入文件,编辑器会打开该文件并以表格的形式显示数据。
第三步:浏览和编辑数据一旦你的CSV 文件被导入到编辑器中,你可以开始浏览和编辑数据了。
表格视图使数据易于组织和查看,每个单元格都对应一个字段。
如果你需要编辑特定的字段,只需在相应的单元格上单击两次即可开始编辑。
在需要修改的字段上输入新值,然后按下Enter 键以保存更改。
如果你需要添加新数据行,找到表格底部的“添加行”选项,并点击它。
新添加的行将会出现在表格的底部,你可以在相应的单元格中输入数据。
第四步:插入和删除列如果你需要插入新的列,找到编辑器工具栏上的“插入列”选项,并点击它。
选择要在表格中插入的列的位置,然后新的列将被添加到该位置。
删除列的过程与插入列类似。
找到编辑器工具栏上的“删除列”选项,并点击它。
然后选择要删除的列,并确认删除操作。
第五步:保存编辑后的文件在编辑完成后,不要忘记保存你的修改。
在编辑器的工具栏中,找到保存选项,点击它。
选择保存文件的位置和名称,并点击保存按钮。
一旦保存成功,你的CSV 文件就会包含你的修改。
结论:编辑CSV 文件需要使用专门的编辑器,如Microsoft Excel、GoogleSheets等。
通过导入CSV 文件,你可以在编辑器中浏览和编辑数据。
一个简单易用C++实现的csv文件解释器,只需要一个函数调用,即可把csv文件转化为C 语言的结构体,同时支持csv的列为数组和类json串的子结体。
与LightJson配合使用,可以方便的转化 csv文件和json文件。
LightJson项目请看:一个简单易用C++实现的csv文件解释器[代码] 结构体定义//嵌套结构体struct TestJsonSub{JSON_BEGIN()JSON_FIELD(bool, m_Bool);JSON_FIELD(int, m_int);JSON_END();};string processPackage(const string package){cout<<"Recive data from:"<<peerName<<" data:"<<package<<endl;vector<string> vec;split(vec,package,is_any_of(delims),token_compress_on);string result;try{double sum=0;for(int i=0;i<vec.size();i++){//cout<<vec[i]<<":"<<std::stod(vec[i])<<endl;sum+=std::stod(vec[i]);}result=boost::join(vec,"+")+"="+boost::lexical_cast<string>(sum); }catch(std::exception e){result="发送的数据包内包含非法数字";}return std::move(result);}bool isclose(){return state=="close";}bool isexpire(){return (std::chrono::system_clock::now()-lasttime)>deadline;}};class Server{//网络服务业务逻辑全部在Server类中,客户端连接后自动创建一个peer typedef Server this_type;private:io_service m_io;acceptor_type m_acceptor;boost::asio::steady_timer timer;std::map<string,std::shared_ptr<Peer>> m_peers;void startTimer(){timer.expires_from_now(std::chrono::seconds(1));timer.async_wait(boost::bind(&this_type::onTimer,this,boost::asio::placeholders ::error));}void onTimer(const system::error_code&){for(auto iter=m_peers.begin();iter!=m_peers.end();){if(iter->second->isclose()||iter->second->isexpire()){cout<<iter->second->getPeerName()<<" is closed."<<endl;m_peers.erase(iter++);}else{iter++;}}startTimer();}public:Server() :timer(m_io),m_acceptor(m_io,endpoint_type(ip::address_v4::from_string(ipaddress),port)){startTimer();accept();}~Server(){m_acceptor.close();}void run(){m_io.run();}void accept(){socket_ptr socket(new socket_type(m_io));m_acceptor.async_accept(*socket,boost::bind(&this_type::accept_handler,this,boo st::asio::placeholders::error,socket));}void accept_handler(const system::error_code& ec,socket_ptr socket){if(ec){return;}auto peer=make_shared<Peer>(socket);//客户端新连接,创建一个对等peer实例,提供服务cout <<"new client:"<< peer->getPeerName()<<endl;m_peers.emplace(make_pair(peer->getPeerName(),peer));accept();//继续接收新的网络连接}};[代码] [Google Go]代码package mainimport ("io/ioutil""net/http""net/""fmt""encoding/json")//----------------------------------// 黄金数据调用示例代码-聚合数据// 在线接口文档:www/docs/29//----------------------------------const APPKEY = "*******************" //您申请的APPKEYfunc main(){//1.上海黄金交易所Request1()//2.上海期货交易所Request2()//3.银行账户黄金Request3()}//1.上海黄金交易所func Request1(){//请求地址juhe :="web:8080/finance/gold/shgold"//初始化参数param:=.Values{}//配置请求参数,方法内部已处理encode问题,中文参数可以直接传参param.Set("key",APPKEY) //APP Keyparam.Set("v","") //JSON格式版本(0或1)默认为0//发送请求data,err:=Get(juhe,param)if err!=nil{fmt.Errorf("请求失败,错误信息:\r\n%v",err)}else{var netReturn map[string]interface{}json.Unmarshal(data,&netReturn)if netReturn["error_code"].(float64)==0{fmt.Printf("接口返回result字段是:\r\n%v",netReturn["result"]) }}}//2.上海期货交易所func Request2(){//请求地址juhe :="web:8080/finance/gold/shfuture"//初始化参数param:=.Values{}//配置请求参数,方法内部已处理encode问题,中文参数可以直接传参param.Set("key",APPKEY) //APP Keyparam.Set("v","") //JSON格式版本(0或1)默认为0//发送请求data,err:=Get(juhe,param)if err!=nil{fmt.Errorf("请求失败,错误信息:\r\n%v",err)}else{var netReturn map[string]interface{}json.Unmarshal(data,&netReturn)if netReturn["error_code"].(float64)==0{fmt.Printf("接口返回result字段是:\r\n%v",netReturn["result"]) }}}//3.银行账户黄金func Request3(){//请求地址juhe :="web:8080/finance/gold/bankgold"//初始化参数param:=.Values{}//配置请求参数,方法内部已处理encode问题,中文参数可以直接传参param.Set("key",APPKEY) //APP Key//发送请求data,err:=Get(juhe,param)if err!=nil{fmt.Errorf("请求失败,错误信息:\r\n%v",err)}else{var netReturn map[string]interface{}json.Unmarshal(data,&netReturn)if netReturn["error_code"].(float64)==0{fmt.Printf("接口返回result字段是:\r\n%v",netReturn["result"]) }}}// get 网络请求func Get(api string,params .Values)(rs[]byte ,err error){var *.,err=.Parse(api)if err!=nil{fmt.Printf("解析错误:\r\n%v",err)return nil,err}//如果参数中有中文参数,这个方法会进行Encode.RawQuery=params.Encode()resp,err:=http.Get(.String())if err!=nil{fmt.Println("err:",err)return nil,err}defer resp.Body.Close()return ioutil.ReadAll(resp.Body)}// post 网络请求 ,params 是.Values类型func Post(api string, params .Values)(rs[]byte,err error){resp,err:=http.PostForm(api, params)if err!=nil{return nil ,err}defer resp.Body.Close()return ioutil.ReadAll(resp.Body)}代码描述:基于GO的黄金数据接口调用代码实例关联数据:黄金数据[代码] [C#]代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using ;using System.IO;using ;using System.Diagnostics;using System.Web;//----------------------------------// 黄金数据调用示例代码-聚合数据// 在线接口文档:www/docs/29// 代码中JsonObject类下载地址:/download/gcm3206021155665/7458439//----------------------------------namespace ConsoleAPI{class Program{static void Main(string[] args){string appkey = "*******************"; //配置您申请的appkey//1.上海黄金交易所string 1 = "web:8080/finance/gold/shgold";var parameters1 = new Dictionary<string, string>();parameters1.Add("key", appkey);//你申请的keyparameters1.Add("v" , ""); //JSON格式版本(0或1)默认为0string result1 = sendPost(1, parameters1, "get");JsonObject newObj1 = new JsonObject(result1);String errorCode1 = newObj1["error_code"].Value;if (errorCode1 == "0"){Debug.WriteLine("成功");Debug.WriteLine(newObj1);}else{//Debug.WriteLine("失败");Debug.WriteLine(newObj1["error_code"].Value+":"+newObj1["reason"].Value); }//2.上海期货交易所string 2 = "web:8080/finance/gold/shfuture";var parameters2 = new Dictionary<string, string>();parameters2.Add("key", appkey);//你申请的keyparameters2.Add("v" , ""); //JSON格式版本(0或1)默认为0string result2 = sendPost(2, parameters2, "get");JsonObject newObj2 = new JsonObject(result2);String errorCode2 = newObj2["error_code"].Value;if (errorCode2 == "0"){Debug.WriteLine("成功");Debug.WriteLine(newObj2);}else{//Debug.WriteLine("失败");Debug.WriteLine(newObj2["error_code"].Value+":"+newObj2["reason"].Value); }//3.银行账户黄金string 3 = "web:8080/finance/gold/bankgold";var parameters3 = new Dictionary<string, string>();parameters3.Add("key", appkey);//你申请的keystring result3 = sendPost(3, parameters3, "get");JsonObject newObj3 = new JsonObject(result3);String errorCode3 = newObj3["error_code"].Value;if (errorCode3 == "0"){Debug.WriteLine("成功");Debug.WriteLine(newObj3);}else{//Debug.WriteLine("失败");Debug.WriteLine(newObj3["error_code"].Value+":"+newObj3["reason"].Value);}}/// <summary>/// Http (GET/POST)/// </summary>/// <param name="">请求</param>/// <param name="parameters">请求参数</param>/// <param name="method">请求方法</param>/// <returns>响应内容</returns>static string sendPost(string , IDictionary<string, string> parameters, string method){if (method.ToLower() == "post"){HttpWebRequest req = null;HttpWebResponse rsp = null;System.IO.Stream reqStream = null;try{req = (HttpWebRequest)WebRequest.Create();req.Method = method;req.KeepAlive = false;req.ProtocolVersion = HttpVersion.Version10;req.Timeout = 5000;req.ContentType ="application/x-www-form-encoded;charset=utf-8";byte[] postData =Encoding.UTF8.GetBytes(BuildQuery(parameters, "utf8"));reqStream = req.GetRequestStream();reqStream.Write(postData, 0, postData.Length);rsp = (HttpWebResponse)req.GetResponse();Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet); return GetResponseAsString(rsp, encoding);}catch (Exception ex){return ex.Message;}finally{if (reqStream != null) reqStream.Close();if (rsp != null) rsp.Close();}}else{//创建请求HttpWebRequest request = (HttpWebRequest)WebRequest.Create( + "?" + BuildQuery(parameters, "utf8"));//GET请求request.Method = "GET";request.ReadWriteTimeout = 5000;request.ContentType = "text/html;charset=UTF-8";HttpWebResponse response =(HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));//返回内容string retString = myStreamReader.ReadToEnd();return retString;}}/// <summary>/// 组装普通文本请求参数。