[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 197
  • Last Modified:

how to break column in my text file ?

I have a text file very large, the problem is that my text has one line with a very long column.

I want to break column to another line after 80 caracter.

How can I do this?

Thanks
0
hidrau
Asked:
hidrau
1 Solution
 
aikimarkCommented:
Is this a delimited (CSV, tab, other) text file?

How are you defining a 'column'?

Where do you need to place the results of your 'broke' column?

=====================
The general algorithm is to iterate through the length of the string, copying the chunks to another data structure, such as a TStringList.  With each iteration, you find the break point by starting 80 characters beyond your current position and inspect the characters 'backwards' (79,78,77, etc.) until you reach a word delimiter.  A word delimiter will typically be a space or hyphen.
0
 
ThievingSixCommented:
I used this code for wrapping text to 55 characters in a text file. Might be useful to you.
function TrimSpaces(Text: String): String;
begin
  Result := Text;
  While Result[1] = #32 Do Delete(Result,1,1);
  While Result[Length(Result)] = #32 Do Delete(Result,Length(Result),1);
end;
 
function StrCharPos(Text: PChar; Chars: TSysCharSet): PChar;
begin
  Result := Text;
  while Result^ <> #0 do
  begin
    if Result^ in Chars then
      Break;
    Inc(Result);
  end;
  if Result^ = #0 then
    Result := nil;
end;
 
function WrapText(const Line, BreakStr: string; BreakChars: TSysCharSet;
  MaxCol: Integer): string;
var
  P, PNewLine, PBreak: PChar;
begin
  Result := '';
  P := PChar(Line);
  PNewLine := P;
  PBreak := StrCharPos(P, BreakChars);
  while PBreak <> nil do
  begin
    if (PBreak - PNewLine + 1) > MaxCol then
    begin
      Result := Result + BreakStr;
      PNewLine := P;
    end;
    while P <= PBreak do
    begin
      Result := Result + P^;
      Inc(P);
    end;
    PBreak := StrCharPos(PBreak + 1, BreakChars);
  end;
  if StrEnd(P) - PNewLine > MaxCol then
    Result := Result + BreakStr;
  while P^ <> #0 do
  begin
    Result := Result + P^;
    Inc(P);
  end;
end;
 
procedure TfrmMain.btnFormatClick(Sender: TObject);
var
  Buffer : String;
  StringList : TStringList;
  FormatList : TStringList;
  I, J : Integer;
begin
  StringList := TStringList.Create;
  Try
    Buffer := mData.Text;
    While Pos(#13#10#13#10,Buffer) > 0 Do
      begin
      StringList.Add(Copy(Buffer,1,Pos(#13#10#13#10,Buffer) - 1));
      Buffer := Copy(Buffer,Pos(#13#10#13#10,Buffer) + 4);
    end;
    StringList.Add(Buffer);
    FormatList := TStringList.Create;
    Try
      For I := 0 To StringList.Count - 1 Do
        begin
        FormatList.Text := StringList.Strings[I];
        For J := 0 To FormatList.Count - 1 Do
          begin
          If Length(FormatList.Strings[J]) > 55 Then
            begin
            FormatList.Text := StringReplace(FormatList.Text,#13#10,#32,[rfReplaceAll]);
            FormatList.Text := WrapText(FormatList.Text,#13#10,[#32],55);
            Break;
          end;
        end;
        For J := 0 To FormatList.Count - 1 Do
          begin
          FormatList.Strings[J] := Trim(FormatList.Strings[J]);
        end;
        StringList.Strings[I] := FormatList.Text;
      end;
    Finally
      FreeAndNil(FormatList);
    end;
  mData.Text := StringReplace(StringList.Text,#13,'',[rfReplaceAll]);
  Finally
    StringList.Free;
  end;
end;

Open in new window

0
 
hidrauAuthor Commented:
thanks very much
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now