标签: stringbuilder

文本重新格式化每次迭代都会逐渐减慢

编辑2

好的,我在gist.github上发布了我的源代码副本,我只有一个我无法解决的挥之不去的问题.

FindLine()总是返回-1.我已将原因缩小到if语句,但我无法弄清楚原因.我知道symbol和symbolList都传递了良好的数据.

/编辑2

我有一个相当简单的C#程序,它查找.csv文件,读取该文件中的文本,重新格式化它(并包含加载到DataTable中的SQL查询中的一些信息),并将其保存到.tsv文件中供以后使用通过另一个程序.

我的问题是,有时源.csv文件超过10,000行,程序在遍历行时逐渐减慢.如果.csv文件是~500行,则需要大约45秒才能完成,并且随着.csv文件变大,这一时间会呈指数级变差.

SQL查询返回37,000多行,但是只请求一次,并且与.csv文件的排序方式相同,所以通常我不会注意到它正在运行该文件,除非它找不到相应的数据,在这种情况下它使它一直通过并返回适当的错误文本.我99%肯定这不是减速的原因.

循环的y和z需要与它们完全一样长.

如果这是绝对必要的,我可以从最初的.csv文件中删除一些数据并发布一个例子,但我真的希望我只是遗漏了一些非常明显的东西.

先谢谢你们!

这是我的来源:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Text;

namespace MoxySectorFormatter
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable resultTable = new DataTable();
            double curLine = 1;
            double numLines = 0;
            string ExportPath = @"***PATH***\***OUTFILE***.tsv";
            string ImportPath = @"***PATH***\***INFILE***.csv";
            string NewText = "SECURITY\r\n";
            string OrigText = "";
            string QueryString = "SELECT DISTINCT UPPER(MP.Symbol) AS Symbol, LOWER(MP.SecType) AS SecType, MBI.Status …
Run Code Online (Sandbox Code Playgroud)

c# string stringbuilder loops

1
推荐指数
1
解决办法
183
查看次数

周围的Scala字符串

如果你在单个语句中执行某些操作,例如"abc"+ stringval +"abc",那么是一个不可变的字符串副本,或者两个(注意到abc和123在编译时是常量)

奖金回合:会使用像下面这样的StringBuilder或多或少的开销?

  def surround(s:String, ss:String):String = {
    val surrounded = new StringBuilder(s.length() + 2*ss.length(), s)
    surrounded.insert(0,ss)
    surrounded.append(ss)
    surrounded.mkString
  }
Run Code Online (Sandbox Code Playgroud)

还是有一种我不知道的更惯用的方式?

string stringbuilder scala string-concatenation immutability

1
推荐指数
1
解决办法
1556
查看次数

AppendLine没有插入新行?

我有以下内容:

StringBuilder errors = new StringBuilder();

if(IsNullOrEmpty(value))
{
errors.AppendLine("Enter value");
}

if(IsNullOrEmpty(value2))
{
errors.AppendLine("Enter value 2");
}
Run Code Online (Sandbox Code Playgroud)

我希望这会显示:

Enter value
Enter value 2

但它显示:

Enter value Enter value 2

我也尝试过: AppendFormat("Enter value{0}",Environment.NewLine);

以及\n角色.

错误字符串输出到asp:Label,如:

lblErrors.Text = errors.ToString();
Run Code Online (Sandbox Code Playgroud)

c# asp.net stringbuilder

1
推荐指数
1
解决办法
2848
查看次数

1
推荐指数
2
解决办法
2106
查看次数

StringBuilder中的system.outofmemoryexception

我有以下代码:

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
    for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
    {
        strCsv.Append( XC.CleanForCsv(ds.Tables[0].Rows[i][j].ToString()) + ",");
    }

    strCsv.Append( "\r\n" + strCsv)
}
Run Code Online (Sandbox Code Playgroud)

Dataset包含8000条记录.for仅在15条记录strCsv.Append( "\r\n" + strCsv)语句之后使用循环循环记录抛出异常说明System.OutOfMemoryException.这个例外背后的原因是什么?

c# stringbuilder

1
推荐指数
1
解决办法
187
查看次数

StringBuilder如何读取超过16个空元素?

这是我的代码:

   public class Stringclass
   {
   public static void main(String args[])
   {

   StringBuilder s=new StringBuilder();
    s.append("v g f j v n x jc kn vd df jdf jkd kfd kfk dfkd lkd fmk dkkdfd kfdkfn kdfd end");


  System.out.println(s);
   }
   }
Run Code Online (Sandbox Code Playgroud)

和输出是

    v g f j v n x jc kn vd df jdf jkd kfd kfk dfkd lkd fmk dkkdfd kfdkfn kdfd end
Run Code Online (Sandbox Code Playgroud)

根据[Java docs](http://docs.oracle.com/javase/tutorial/java/data/buffers.html),字符串构建器只能存储16个空字符,所以我怎样才能将所有字符都存储为输出.

如果我写这个代码,那么输出也是一样的:

    public class Stringclass
    {
    public static void main(String args[])
    {

    StringBuilder s=new StringBuilder("v …
Run Code Online (Sandbox Code Playgroud)

java stringbuilder

1
推荐指数
1
解决办法
195
查看次数

从电子邮件正文中删除换行符

我正在使用System.Net.Mail.MailMessage该类生成一个简单的电子邮件,并使用StringBuilder.我正在循环string[]并尝试每次添加一个新行.我遇到的问题是我似乎每次都无法生成一个新行.我可以得到两个或没有.

我尝试过的:

foreach (var message in messages)
{
    body.AppendLine(message);
}

foreach (var message in messages)
{
    body.Append(message + "\n");
}

foreach (var message in messages)
{
    body.Append(message + System.Environment.NewLine);
}
Run Code Online (Sandbox Code Playgroud)

我也试过了string.Format().

对于上面的每个例子,我得到相同的结果.没有生成新行.

但是,当我尝试以下操作时,我得到了预期的结果.中间有空行的新行.

foreach (var message in messages)
{
    body.AppendLine(message + System.Environment.NewLine);
}
Run Code Online (Sandbox Code Playgroud)

为什么要这样做,我该怎么办才能每次只获得一条新线?

更新:

所以我发现Outlook和可能的Gmail(没有测试过其他人)实际上是删除了一些换行而不是其他换行符.有谁知道他们为什么或如何确定要删除的内容?

在此输入图像描述

c# outlook gmail stringbuilder newline

1
推荐指数
1
解决办法
7444
查看次数

在字符串中的特定字符后添加空格

基本上,(dog)(cat)(mouse)需要(dog) (cat) (mouse).

我试过的代码:

StringBuilder sb = new StringBuilder("(dog)(cat)(mouse)");

for (int i = 0; i < sb.length(); i ++)
{
   if (sb.charAt(i) == ')')
   {
      sb.insert(i, ' ');
   }
}

String result = sb.toString();
Run Code Online (Sandbox Code Playgroud)

但我得到某种"Java堆空间"错误

java string stringbuilder char

1
推荐指数
1
解决办法
5918
查看次数

Sonar抱怨:使用StringBuilder而不是StringBuffer

我目前正在做一段代码,必须能够匹配一些正则表达式,并在匹配正则表达式的字符串中进行一些替换.

为了做到这一点,我在java中使用matcher对象.但正如您可以在互联网上看到的那样,所有示例都使用StringBuffer来使用appendreplacement和appendtail方法(oracleDoc)进行替换.

但是当我推送我的代码时,Sonar抱怨使用stringbuffer而不是stringbuilder.

  • 在这种情况下,Sonar的这个警告是错误的吗?
  • 是否有任何库使用stringbuilder执行相同的操作?

显然,一些开发人员抱怨这里.

我找到了一种不使用StringBuffer并使用StringBuilder的方法,但我确信这不如使用StringBuffer那样有效(并且可能是一种不好的做法).您可以在junit测试中复制粘贴,此示例代码如下:

    String entry = "Actual 4.11-6 and 13-5";
    String expectedReturn = "Actual 4*11^(-6) and 13^(-5)";

    String number = "(^|\\s)-?\\d+((\\.||,)\\d+){0,1}(.\\d+){0,1}-\\d+";
    Pattern pattern = Pattern.compile(number);
    Matcher matcher = pattern.matcher(entry);

    //USING STRING BUFFER
    StringBuffer stringBuffer = new StringBuffer();
    String substring;
    while(matcher.find()){
        substring = matcher.group(0);
        matcher.appendReplacement(stringBuffer,substring.replace(".","*").replace("-","^(-")+")");
    }
    matcher.appendTail(stringBuffer);

    //USING STRING BUILDER
    matcher = pattern.matcher(entry);
    int lastIndex = 0;
    StringBuilder stringBuilder = new StringBuilder();
    while(matcher.find()){
        stringBuilder.append(entry.substring(lastIndex,matcher.start()));
        substring = matcher.group(0);
        stringBuilder.append(substring.replace(".","*").replace("-","^(-")+")");
        lastIndex = matcher.end(); …
Run Code Online (Sandbox Code Playgroud)

java stringbuilder append stringbuffer sonarqube

1
推荐指数
1
解决办法
1689
查看次数

StringBuilder中有多个StringBuilder。值得吗?

我收到型号清单。模型的数量可能很大。该模型具有许多特性,其中任何一个都可能为

我需要基于其属性为每个模型构建一个字符串。如果property == null,则将一些静态部分添加到结果字符串中,例如“ property1为null”

如果else 属性== null,则添加类似以下内容:“ property1 =='valueOfThePropertyHere'”

结果字符串应如下所示: prop1 == 'value1' and prop2 is null and prop3 == 'value3' and prop4 == 'value4' and prop5 is null and ..... propN == 'valueN'

然后从列表中为每个模型生成这样的字符串。

显然,我在for循环中执行此操作,为此我使用了StringBuilder。关键是在StringBuilder的append方法中,我使用三元运算符检查模型的每个字段是否为null,并基于此将检查结果添加到结果字符串中。但是,如果属性不为null,则需要添加一些静态部分+字段本身的值+一些更多静态内容。这意味着我需要为我拥有的每个属性再添加一个StringBuilder。或者我可以使用“ +”,无论如何它将被转换成StringBuilder,据我所知,在StringBuilder中使用“ +”是一个不好的做法(但是我仍然必须使用它)。

例:

List<Model> models = repository.getModels();

for (Model m: models) {
    StringBuilder stringBuilder = new StringBuilder();

    stringBuilder
    .append(m.getField1() == null ? "field1  is null" : "field1 == '" + new StringBuiler().append(m.getField1()).append("'").append(" …
Run Code Online (Sandbox Code Playgroud)

java string performance stringbuilder concatenation

1
推荐指数
1
解决办法
69
查看次数