关于读ini,csv文件,及文件内容的数据转换

1.问题来源

        近日在工作中使用qt读项目的所有配置文件中数据存在以十六进制的字符串形式存储,此时应该如何做到数据读取和数据转换。

2.解决思路

        针对以上问题的解决思路:①写配置文件  ②读配置文件  ③依据配置文件中获取的数据加载其它文件数据  ④读取目标文件内的数据  ⑤将目标文件中的十六进制字符串转换成十进制放入内存

3.配置文件

        在日常的工作中,有时候需要将部分信息保存到本地,也就是写入到INI文件中,便于下次使用;在Qt中可以使用QSetting来进行INI文件的读写。

        QSettings 是对这些技术的抽象,使用户能够以可移植的方式保存和恢复应用程序设置。它还支持自定义存储格式。

        QSettings 的 API 是基于 QVariant 的,可以让用户便捷地保存大多数基于值的类型,例如 QString、QRect 和 QImage。构造和销毁 QSettings 对象都非常快。如果在应用程序的许多地方使用 QSettings,可使用 QCoreApplication类指定组织名称和应用程序名称,然后使用默认的 QSettings ;

函数说明:QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)

//用QSetting读入ini文件
 QSettings *setconfig;
 setconfig=new QSettings("E:/qt_test/FreqCalUiWidght/config.ini",QSettings::IniFormat);

        filename是ini的文件路径,QSettings::IniFormat是构造QSetting结构,读取ini文件,并将文件读入内存中。

(1)读ini文件

    csvpath=setconfig->value("path/csvpath").toString();

        value是QSettings中读ini文件的函数,格式是“一级标题/二级标题”,value的返回值是QVariant,所以所以这里为了获取字符串所以需要用toString()进行一次格式转换。

(2)写ini文件

    csvpath=setconfig->setValue("path/csvpath",0);

 setValue是QSettings中写ini文件的函数,格式是“一级标题/二级标题”

4.CSV文件

使用QStringList及QTextStream实现CSV文件读写
适用于:对于小型数据量的CSV文件。

优点:

1.实现简单:使用QStringList和QTextStream实现CSV读写操作非常简单,能够快速上手;
2.代码量少:相对其他实现方式,该方法实现的代码量较少。
缺点:

1.写入数据顺序不能改变。
2.当数据量大的时候,使用该方法逐行写入文件,文件I/O开销相对较大,导致写入速度变慢。
3.同时,该实现方式要求数据顺序不能改变,因为每行数据只存储在单独的QStringList中。

//读csv文件
QList<QList<QVariant>> HandleProcess::ReadCSVFunc(QString filename)
{
    QList<QList<QVariant>> m_varListList;
    QFile file(filename);
    if(!file.exists())
    {
        return m_varListList;
    }
    file.open(QFile::ReadOnly);
    QTextStream in(&file);

    QString strLine;
    int i=0;
    QList<QList<QVariant>> varListList;
    while(!in.atEnd())
    {
        strLine =in.readLine();
        strLine.remove("\r");
        strLine.remove("\n");
        QStringList strList;
        if(strLine.contains(","))
        {
            strList = strLine.split(",",QString::KeepEmptyParts);
        }
        else if(strLine.contains(" "))
        {
            strList = strLine.split(" ",QString::KeepEmptyParts);
        }
        else if(strLine.contains("\t"))
        {
            strList = strLine.split("\t",QString::KeepEmptyParts);
        }
        QList<QVariant> varList;
        foreach(QString str,strList)
        {
            varList.append(QVariant(str));
        }
        varListList.append(varList);
        i++;
    }
    file.close();
    m_varListList=varListList;
    return m_varListList;
}

readline()按行读取文件。 

以remove("/r")为例,是将此行中的/r移除。

QtSplit函数最基本的用法就是将一个字符串按照指定分隔符进行分割,分割结果会以QList的方式返回。split()是移除分隔符,QStriing::KeepEmptyParts是移除分隔符后以空保留。 

5.读取csv后对数据进行转换

        有一项数据是将数据转换成十六进制的字符串格式存储在文件中,在做数据处理时需要读入数据并将数据从字符串转换成十六进制,再转换成十进制。

QByteArray temp=QByteArray::fromHex(csvlist[i].toByteArray());
temp=temp.toHex();
bool ok;
double temp1=temp.toInt(&ok,16);
QList<double> data;
data.append(temp1);

        先将存储在QList<Varient> csvlist中的数据放入QByteArray的变量中,变量自转换成16进制,即完成字符串转换成十六进制这一步。此后按需要的变量类型,将数据从16进制转换成10进制。

  • 14
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻瓜小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值