如何使用 Matlab 按字母顺序对属性值对进行排序

     2023-03-06     134

关键词:

【中文标题】如何使用 Matlab 按字母顺序对属性值对进行排序【英文标题】:How to sort property -value pair in alphabetical order with Matlab 【发布时间】:2013-01-20 21:21:22 【问题描述】:

我想向现有文件添加一个属性值对。同时,所有属性都应按字母顺序排列。例如:

[Info] % property 1
value 1 
[system] % property 2
value 2

如何添加其他属性,以便所有属性都按字母顺序排序。我能够使用将属性值对添加到文件末尾 fh = fopen(filename,'a') 但我无法按字母顺序对它们进行排序。

到目前为止,我尝试了以下方法,但使用此方法时,它只会打印新的属性-值对。我想在打印新属性后打印剩余属性。

function [] = myfun(filename ,propName,propvalue)
rfh = fopen(filename,'r');
tname = tempname();
wfh = fopen(tname,'w');
line = fgetl(rfh);

while ischar(line)

    if (line(1) == '[') && (line(end) == ']')
        property = lower(line(2:end-1)) % from ini file
        String2 = property;
        String1 = propName;
        [sat] = sor(String1,String2)% subfunction
        if sat == -1
            fprintf(wfh,'[%s]\r\n%s\r\n',propName,propvalue);
        else
            fprintf(wfh,'%s\r\n',line);
        end
    else
        fprintf(wfh,'%s\r\n',line);
    end
    line = fgetl(rfh);
end
fclose(rfh);
fclose(wfh);
movefile(tname,filename,'f')

function [sat] = sor(String1,String2)
Index = 1;

while Index < length(String1) && Index < length(String2) && String1(Index) == String2(Index)
    Index = Index + 1;
end

% Return the appropriate code
if String1(Index) < String2(Index)
    sat= -1
elseif String1(Index) > String2(Index)
    sat= +1
else % the characters at this position are equal -- the shorter of the two strings should be "less than"
    if length(String1) == length(String2)
        sat = 0
    elseif length(String1) <  length(String2)
        sat = -1
    else
        sat = +1
    end
end

【问题讨论】:

【参考方案1】:

这是.ini 文件吗?您可能想查看来自 MATLAB File Exchange 的INIConfig,这是一组用于处理排列在一个方便类中的 INI 文件的例程。我没有使用它,但也许它可以满足您的需求。

如果没有,您可以随时:

    读入文件 逐行循环 当您发现以[ 开头的行后跟一个按字母顺序排列的单词,比您要插入的属性晚,请插入您的属性和值 包括文件的其余部分 重新写回整个文件。

【讨论】:

@Sam,感谢您的快速反应。你能给我一些关于如何定义余数的步骤(4)的提示吗?并确保该文件是“.ini”文件。 将文件读入变量filetext。创建一个空字符串temptext。循环遍历filetext 的每一行。如果它不是以[ 开头,或者如果它以[ 开头,然后在您的新属性之前按字母顺序排列一个单词,请将该行添加到temptext。如果它以[ 开头,然后在您的新属性之后按字母顺序排列一个单词,则将您的新属性添加到temptext 并继续将filetext 的所有剩余行添加到temptext。最后将temptext 写到一个新文件中。 @Sam,您能否给我一个提示,告诉我在添加新的 prop-value 对后如何继续添加文件的其余部分。我一直在尝试,但到目前为止我确实成功了。你可以看看我上面的试用代码。非常感谢您的帮助。 对不起@bstar,我最近没机会看这个。与此同时,Shai 似乎提供了一个非常完整的解决方案。 @山姆。非常感谢您的反应。确实,来自 shai 的代码很棒。谢谢你们!!【参考方案2】:

将文件读入struct怎么样?

function fileData = readFileIntoStruct( fileName )
%
% read [property] value pairs file into struct
% 
fh = fopen( fileName, 'r' ); % read handle
line = fgetl( fh );
while ischar( line )
    % property
    tkn = regexp( line, '\[([^\]+)]\]', 'once', 'tokens' );
    % read next line for value
    val = fgetl( fh );
    fileDate.(tkn1) = val;
    line = fgetl( fh ); % keep reading
end
fclose( fh ); % don't forget to close the file at the end.

现在您将所有数据作为 struct,属性作为 fieldnames,值作为 field 值。

现在您可以通过以下方式更新属性:

function fileData = updateProperty( fileData, propName, newVal )
if isfield( fileData, propName )
    fileData.(propName) = newVal;
else
    warning( 'property %s does not exist - please add it first', propName );
end

你可以添加一个属性:

function fileData = addProperty( fileData, propName, newVal )
if ~isfield( fileData, propName )
    fileData.(propName) = newVal;
else
    warning ( 'property %s already exists, use update to change its value', propName );
end

您可以使用orderfields按字母顺序对属性进行排序:

fileData = orderfields( fileData );

您可以简单地将struct 写回文件:

function writeDataToFile( newFileName, fileData )
fopen( newFileName , 'w' ); %write handle
propNames = fieldnames( fileData );
for ii = 1:numel( propNames )
    fprintf( fh, '[%s]\r\n%s\r\n', propNamesii, fileData.(propNamesii) );
end
fclose( fh ); 

假设:

    属性名称是合法的 Matlab 字段名称(详见变量命名)。

    每个属性的值总是一个字符串。

    我没有在这些示例中包含任何错误检查代码(未找到文件、格式​​错误的字符串等)

    我假设输入文件是严格的“[prop] val”对,没有任何额外的 cmets 等。

【讨论】:

@shai,感谢您的详细回答。但是,输入文件是 [prop] 和新行中的值。 @bstar - 确实如此。如果您仔细查看 function readFileIntoStruct val 取自文件中的 next 行 (fgetl)。而且,写回文件的函数也会把它们放到不同的行中。 @ shai,非常感谢它提供的代码,到目前为止我需要它。最重要的是,我想添加/或拥有结构属性。可以给我一些提示。特别是最终将属性结构写入文件。我的属性将类似于:[properties] newline key= value(这可能是超过 2 个键值对) @shai,非常感谢。现在每件事都完美无缺。包括财产结构。但是,我试图在其中添加一项功能。目的是指定 property_name 的数据类型。像 [system]%string 一样,当我尝试写入 ini 文件时,我收到一个错误,即无效的文件名。数据类型是它自己的输入。有没有办法写数据类型。谢谢 @bstar - 这是一个新问题。请照原样发布 - 带有指向此的链接。

如何使用 NSFetchedResultsController 按字母顺序对 UITableView 进行排序?

】如何使用NSFetchedResultsController按字母顺序对UITableView进行排序?【英文标题】:HowcanIsortmyUITableViewalphabeticallywithNSFetchedResultsController?【发布时间】:2011-04-1408:22:19【问题描述】:当用户按下“按字母顺序排序”时,我为我的表... 查看详情

按属性值对 Flutter (Dart) 中的对象列表进行排序

...bypropertyvalue【发布时间】:2020-03-0817:58:29【问题描述】:如何按其中一个属性的字母顺序对对象列表进行排序(不是名称,而是属性所包含的实际值)?【问题讨论】:HowcanIsortalistofstringsinDart?的可能重复@RichardHeap是的,该解决 查看详情

使用绑定源时如何按字母顺序对 DataGridView 进行排序?

】使用绑定源时如何按字母顺序对DataGridView进行排序?【英文标题】:HowtosortDataGridViewalphabeticallywhenusingbindingsource?【发布时间】:2022-01-2319:02:34【问题描述】:由于某种原因,当我使用列表作为绑定源时,dataGridView不允许我以... 查看详情

如何按字母顺序对项目进行排序?

】如何按字母顺序对项目进行排序?【英文标题】:Howtosortitemsalphabetically?【发布时间】:2022-01-1313:37:05【问题描述】:我正在尝试对下拉列表中的全名列表进行排序,例如:列表==>帕特里克·穆法鲁埃托CancelloRettin阿德里亚诺... 查看详情

如何使用自定义模型类按部分按字母顺序对 tableView 中的数据进行排序?

】如何使用自定义模型类按部分按字母顺序对tableView中的数据进行排序?【英文标题】:HowdoyousortdatainatableViewalphabeticallybysectionusingacustommodelclass?【发布时间】:2017-01-1404:57:06【问题描述】:我是编码新手,一直在尝试按部分按... 查看详情

在 C++ 中使用链表按字母顺序对字符串进行排序

】在C++中使用链表按字母顺序对字符串进行排序【英文标题】:sortstringsinalphabeticalorderwithlinkedlistsinc++【发布时间】:2017-04-0605:15:09【问题描述】:我正在分配字符串的链表。在我进入排序部分之前,一切似乎都很好。我也在使... 查看详情

Intellij-IDEA:如何按字母顺序对成员进行排序?

】Intellij-IDEA:如何按字母顺序对成员进行排序?【英文标题】:Intellij-IDEA:Howtosortmembersalphabetically?【发布时间】:2013-06-3009:42:15【问题描述】:我正在使用Intellij-IDEA12。大多数团队成员使用Eclipse,在保存它时,首先根据可见性... 查看详情

如何使用 Vim 按字母顺序对 JS es6 导入进行排序

】如何使用Vim按字母顺序对JSes6导入进行排序【英文标题】:HowusingVimalphabeticallysortJSes6imports【发布时间】:2019-03-1023:39:57【问题描述】:我将vim用作IDE用于typescript项目。importFlightInfofrom\'./FlightInfo\'importInfoBlockProps,InfoRowProps,INavig... 查看详情

如何按字母顺序对 QTableView 中的项目进行排序

】如何按字母顺序对QTableView中的项目进行排序【英文标题】:HowcanisortitemsinaQTableViewinalphabeticorder【发布时间】:2018-02-1603:35:41【问题描述】:我想按字母顺序对QTableView中的项目进行排序。我已经搜索了互联网,但一切都在脉络... 查看详情

如何按字母顺序对 PHP 中的数组进行排序? [复制]

】如何按字母顺序对PHP中的数组进行排序?[复制]【英文标题】:HowcanIsortanarrayinPHPalphabetically?[duplicate]【发布时间】:2011-11-0416:30:39【问题描述】:可能的重复:HowtosortamultidimensionalarrayinPHPalphabetically?PHP:Sortarrayalphabetically我正在... 查看详情

java - 如何仅使用Java中的util.Scanner包按字母顺序对单个字符串进行排序?

】java-如何仅使用Java中的util.Scanner包按字母顺序对单个字符串进行排序?【英文标题】:HowtosortasingleStringinAlphabeticOrderwithonlyutil.ScannerpackageinJava?【发布时间】:2020-09-1001:28:25【问题描述】:只允许使用importjava.util.Scanner包。如何... 查看详情

如何按字母顺序对数据框的行进行排序? [复制]

】如何按字母顺序对数据框的行进行排序?[复制]【英文标题】:Howtosortalphabeticallyrowsofadataframe?[duplicate]【发布时间】:2015-04-2706:38:57【问题描述】:我想按字母顺序对c排序ifx[i]==x[i+1]。我使用了order()函数,但它也更改了x列。... 查看详情

根据字符串属性按字母顺序对对象数组进行排序

】根据字符串属性按字母顺序对对象数组进行排序【英文标题】:SortingArrayofObjectsalphabeticallybasedonastringattribute【发布时间】:2012-01-1203:47:05【问题描述】:我有一个UITableView,它填充了一个“产品”类型的对象数组,每个对象都... 查看详情

如何对按字母顺序排列的文本字段进行排序?

】如何对按字母顺序排列的文本字段进行排序?【英文标题】:HowdoIsortanalphabeticaltextfield?【发布时间】:2011-08-2513:56:31【问题描述】:我有几条记录需要排序,但字段是varchar。他们使用A-Z的英文字母。在Z之后,它来自AA、AB、AC... 查看详情

如何在 Laravel 中按字母顺序对记录进行排序

】如何在Laravel中按字母顺序对记录进行排序【英文标题】:HowtosortrecordsinalphabeticalorderinLaravel【发布时间】:2018-04-2502:22:25【问题描述】:如何在laravel中按字母顺序对记录进行排序?publicfunctionindex()$comproducts=Comproduct::paginate(3);$... 查看详情

按字母顺序对 c 字符串数组进行排序

...制如下)可以对数组进行排序,但仅基于第一个字母表。如何进一步对具有相同初始字母的字符串进行排序?<snip 查看详情

Swift如何使用属性按给定顺序对自定义对象数组进行排序

】Swift如何使用属性按给定顺序对自定义对象数组进行排序【英文标题】:Swifthowtosortanarrayofcustomobjectsinagivenorderwithproperty【发布时间】:2017-07-3017:51:47【问题描述】:我有一组按特定顺序排列的餐馆ID。我进行网络调用以获取这... 查看详情

在 C# 中按字母顺序对 XML 文档进行排序

】在C#中按字母顺序对XML文档进行排序【英文标题】:SortXMLdocumentalphabeticallyinC#【发布时间】:2022-01-0602:37:09【问题描述】:在C#中,按字母顺序对XML文档进行排序的最佳方法是什么——元素和属性?例如,如果我以b.xml开头,它... 查看详情